diff --git a/src/.tools/linq2db.t4models/FirebirdSql.Data.FirebirdClient.dll b/src/.tools/linq2db.t4models/FirebirdSql.Data.FirebirdClient.dll
deleted file mode 100644
index dd8e0105289d37e4be97c1419fd12a2cbc6e00c4..0000000000000000000000000000000000000000
Binary files a/src/.tools/linq2db.t4models/FirebirdSql.Data.FirebirdClient.dll and /dev/null differ
diff --git a/src/.tools/linq2db.t4models/Init.ps1 b/src/.tools/linq2db.t4models/Init.ps1
deleted file mode 100644
index d7e710d55907097cf93d3d3e546801028e12d906..0000000000000000000000000000000000000000
--- a/src/.tools/linq2db.t4models/Init.ps1
+++ /dev/null
@@ -1,9 +0,0 @@
-param($installPath, $toolsPath, $package, $project)
-
-# get the active solution
-$solution           = Get-Interface $dte.Solution ([EnvDTE80.Solution2])
-$solutionPath       = [System.IO.Path]::GetDirectoryName($solution.FullName)
-$linq2dbToolsPath   = [System.IO.Path]::Combine($solutionPath, ".tools", "linq2db.t4models")
-
-# tools copy
-xcopy $("$toolsPath\*.*") $("$linq2dbToolsPath\") /y /e
diff --git a/src/.tools/linq2db.t4models/Microsoft.SqlServer.Types.dll b/src/.tools/linq2db.t4models/Microsoft.SqlServer.Types.dll
deleted file mode 100644
index d4dd789939d82c83eb2720bf5868234ffafca86d..0000000000000000000000000000000000000000
Binary files a/src/.tools/linq2db.t4models/Microsoft.SqlServer.Types.dll and /dev/null differ
diff --git a/src/.tools/linq2db.t4models/MySql.Data.dll b/src/.tools/linq2db.t4models/MySql.Data.dll
deleted file mode 100644
index d97ad46b903f211ecb4e3e09bc44e7128ec887e2..0000000000000000000000000000000000000000
Binary files a/src/.tools/linq2db.t4models/MySql.Data.dll and /dev/null differ
diff --git a/src/.tools/linq2db.t4models/Npgsql.dll b/src/.tools/linq2db.t4models/Npgsql.dll
deleted file mode 100644
index c814b2681c107eac00cbb32812954bc9d163ba73..0000000000000000000000000000000000000000
Binary files a/src/.tools/linq2db.t4models/Npgsql.dll and /dev/null differ
diff --git a/src/.tools/linq2db.t4models/Oracle.ManagedDataAccess.dll b/src/.tools/linq2db.t4models/Oracle.ManagedDataAccess.dll
deleted file mode 100644
index c228b7093fb73194e9bf9689d99b1154a963cf15..0000000000000000000000000000000000000000
Binary files a/src/.tools/linq2db.t4models/Oracle.ManagedDataAccess.dll and /dev/null differ
diff --git a/src/.tools/linq2db.t4models/SQLite.Interop.dll b/src/.tools/linq2db.t4models/SQLite.Interop.dll
deleted file mode 100644
index 5b872055f5a4b1b759bfa0811901675d4c01346b..0000000000000000000000000000000000000000
Binary files a/src/.tools/linq2db.t4models/SQLite.Interop.dll and /dev/null differ
diff --git a/src/.tools/linq2db.t4models/System.Data.SQLite.dll b/src/.tools/linq2db.t4models/System.Data.SQLite.dll
deleted file mode 100644
index 59f3dcc375988dbd291f100bd06f259b88a887e0..0000000000000000000000000000000000000000
Binary files a/src/.tools/linq2db.t4models/System.Data.SQLite.dll and /dev/null differ
diff --git a/src/.tools/linq2db.t4models/System.Threading.Tasks.Extensions.dll b/src/.tools/linq2db.t4models/System.Threading.Tasks.Extensions.dll
deleted file mode 100644
index 6807cbd9ba040b9f721a03d7fbe6bc0ec088d50b..0000000000000000000000000000000000000000
Binary files a/src/.tools/linq2db.t4models/System.Threading.Tasks.Extensions.dll and /dev/null differ
diff --git a/src/.tools/linq2db.t4models/linq2db.dll b/src/.tools/linq2db.t4models/linq2db.dll
deleted file mode 100644
index bcbdac1d0742aad9fe3866797e3036961812b53d..0000000000000000000000000000000000000000
Binary files a/src/.tools/linq2db.t4models/linq2db.dll and /dev/null differ
diff --git a/src/Version/App.config b/src/Version/App.config
deleted file mode 100644
index 9a78cf9f40f376983adf6b40c385c1e5f2bfecd6..0000000000000000000000000000000000000000
--- a/src/Version/App.config
+++ /dev/null
@@ -1,171 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<configuration>
-  <configSections>
-        <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
-        <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
-    </configSections>
-    <startup> 
-        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
-    </startup>
-    <entityFramework>
-        <providers>
-            <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
-        </providers>
-    </entityFramework>
-  <runtime>
-    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
-      <dependentAssembly>
-        <assemblyIdentity name="linq2db" publicKeyToken="e41013125f9e410a" culture="neutral" />
-        <bindingRedirect oldVersion="0.0.0.0-3.1.1.0" newVersion="3.1.1.0" />
-      </dependentAssembly>
-      <dependentAssembly>
-        <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
-        <bindingRedirect oldVersion="0.0.0.0-12.0.0.0" newVersion="12.0.0.0" />
-      </dependentAssembly>
-      <dependentAssembly>
-        <assemblyIdentity name="Microsoft.IdentityModel.Logging" publicKeyToken="31bf3856ad364e35" culture="neutral" />
-        <bindingRedirect oldVersion="0.0.0.0-5.5.0.0" newVersion="5.5.0.0" />
-      </dependentAssembly>
-      <dependentAssembly>
-        <assemblyIdentity name="Microsoft.IdentityModel.Tokens" publicKeyToken="31bf3856ad364e35" culture="neutral" />
-        <bindingRedirect oldVersion="0.0.0.0-5.5.0.0" newVersion="5.5.0.0" />
-      </dependentAssembly>
-      <dependentAssembly>
-        <assemblyIdentity name="System.IdentityModel.Tokens.Jwt" publicKeyToken="31bf3856ad364e35" culture="neutral" />
-        <bindingRedirect oldVersion="0.0.0.0-5.5.0.0" newVersion="5.5.0.0" />
-      </dependentAssembly>
-      <dependentAssembly>
-        <assemblyIdentity name="System.Numerics.Vectors" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
-        <bindingRedirect oldVersion="0.0.0.0-4.1.4.0" newVersion="4.1.4.0" />
-      </dependentAssembly>
-      <dependentAssembly>
-        <assemblyIdentity name="System.Buffers" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
-        <bindingRedirect oldVersion="0.0.0.0-4.0.3.0" newVersion="4.0.3.0" />
-      </dependentAssembly>
-      <dependentAssembly>
-        <assemblyIdentity name="System.Runtime.CompilerServices.Unsafe" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
-        <bindingRedirect oldVersion="0.0.0.0-4.0.4.1" newVersion="4.0.4.1" />
-      </dependentAssembly>
-      <dependentAssembly>
-        <assemblyIdentity name="Microsoft.Extensions.Configuration.Abstractions" publicKeyToken="adb9793829ddae60" culture="neutral" />
-        <bindingRedirect oldVersion="0.0.0.0-2.2.0.0" newVersion="2.2.0.0" />
-      </dependentAssembly>
-      <dependentAssembly>
-        <assemblyIdentity name="Microsoft.Extensions.Logging.Abstractions" publicKeyToken="adb9793829ddae60" culture="neutral" />
-        <bindingRedirect oldVersion="0.0.0.0-2.2.0.0" newVersion="2.2.0.0" />
-      </dependentAssembly>
-      <dependentAssembly>
-        <assemblyIdentity name="Microsoft.Extensions.Logging" publicKeyToken="adb9793829ddae60" culture="neutral" />
-        <bindingRedirect oldVersion="0.0.0.0-2.2.0.0" newVersion="2.2.0.0" />
-      </dependentAssembly>
-      <dependentAssembly>
-        <assemblyIdentity name="Microsoft.Extensions.DependencyInjection.Abstractions" publicKeyToken="adb9793829ddae60" culture="neutral" />
-        <bindingRedirect oldVersion="0.0.0.0-2.2.0.0" newVersion="2.2.0.0" />
-      </dependentAssembly>
-      <dependentAssembly>
-        <assemblyIdentity name="Microsoft.Extensions.Primitives" publicKeyToken="adb9793829ddae60" culture="neutral" />
-        <bindingRedirect oldVersion="0.0.0.0-2.2.0.0" newVersion="2.2.0.0" />
-      </dependentAssembly>
-      <dependentAssembly>
-        <assemblyIdentity name="Microsoft.Extensions.FileProviders.Abstractions" publicKeyToken="adb9793829ddae60" culture="neutral" />
-        <bindingRedirect oldVersion="0.0.0.0-2.2.0.0" newVersion="2.2.0.0" />
-      </dependentAssembly>
-      <dependentAssembly>
-        <assemblyIdentity name="System.Runtime.InteropServices.RuntimeInformation" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
-        <bindingRedirect oldVersion="0.0.0.0-4.0.2.0" newVersion="4.0.2.0" />
-      </dependentAssembly>
-      <dependentAssembly>
-        <assemblyIdentity name="System.Security.Principal.Windows" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
-        <bindingRedirect oldVersion="0.0.0.0-4.1.1.1" newVersion="4.1.1.1" />
-      </dependentAssembly>
-      <dependentAssembly>
-        <assemblyIdentity name="System.Diagnostics.DiagnosticSource" publicKeyToken="cc7b13ffcd2ddd51" culture="neutral" />
-        <bindingRedirect oldVersion="0.0.0.0-4.0.3.1" newVersion="4.0.3.1" />
-      </dependentAssembly>
-      <dependentAssembly>
-        <assemblyIdentity name="Microsoft.AspNetCore.Http" publicKeyToken="adb9793829ddae60" culture="neutral" />
-        <bindingRedirect oldVersion="0.0.0.0-2.2.2.0" newVersion="2.2.2.0" />
-      </dependentAssembly>
-      <dependentAssembly>
-        <assemblyIdentity name="Microsoft.AspNetCore.Http.Abstractions" publicKeyToken="adb9793829ddae60" culture="neutral" />
-        <bindingRedirect oldVersion="0.0.0.0-2.2.0.0" newVersion="2.2.0.0" />
-      </dependentAssembly>
-      <dependentAssembly>
-        <assemblyIdentity name="Microsoft.AspNetCore.Hosting.Abstractions" publicKeyToken="adb9793829ddae60" culture="neutral" />
-        <bindingRedirect oldVersion="0.0.0.0-2.2.0.0" newVersion="2.2.0.0" />
-      </dependentAssembly>
-      <dependentAssembly>
-        <assemblyIdentity name="Microsoft.Extensions.Hosting.Abstractions" publicKeyToken="adb9793829ddae60" culture="neutral" />
-        <bindingRedirect oldVersion="0.0.0.0-2.2.0.0" newVersion="2.2.0.0" />
-      </dependentAssembly>
-      <dependentAssembly>
-        <assemblyIdentity name="Microsoft.AspNetCore.Http.Features" publicKeyToken="adb9793829ddae60" culture="neutral" />
-        <bindingRedirect oldVersion="0.0.0.0-2.2.0.0" newVersion="2.2.0.0" />
-      </dependentAssembly>
-      <dependentAssembly>
-        <assemblyIdentity name="Microsoft.AspNetCore.Routing.Abstractions" publicKeyToken="adb9793829ddae60" culture="neutral" />
-        <bindingRedirect oldVersion="0.0.0.0-2.2.0.0" newVersion="2.2.0.0" />
-      </dependentAssembly>
-      <dependentAssembly>
-        <assemblyIdentity name="Microsoft.AspNetCore.Routing" publicKeyToken="adb9793829ddae60" culture="neutral" />
-        <bindingRedirect oldVersion="0.0.0.0-2.2.2.0" newVersion="2.2.2.0" />
-      </dependentAssembly>
-      <dependentAssembly>
-        <assemblyIdentity name="Microsoft.AspNetCore.Mvc.Core" publicKeyToken="adb9793829ddae60" culture="neutral" />
-        <bindingRedirect oldVersion="0.0.0.0-2.2.2.0" newVersion="2.2.2.0" />
-      </dependentAssembly>
-      <dependentAssembly>
-        <assemblyIdentity name="System.ComponentModel.Annotations" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
-        <bindingRedirect oldVersion="0.0.0.0-4.2.1.0" newVersion="4.2.1.0" />
-      </dependentAssembly>
-      <dependentAssembly>
-        <assemblyIdentity name="Microsoft.CodeAnalysis" publicKeyToken="31bf3856ad364e35" culture="neutral" />
-        <bindingRedirect oldVersion="0.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
-      </dependentAssembly>
-      <dependentAssembly>
-        <assemblyIdentity name="Microsoft.CodeAnalysis.CSharp" publicKeyToken="31bf3856ad364e35" culture="neutral" />
-        <bindingRedirect oldVersion="0.0.0.0-3.0.0.0" newVersion="3.0.0.0" />
-      </dependentAssembly>
-      <dependentAssembly>
-        <assemblyIdentity name="System.Collections.Immutable" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
-        <bindingRedirect oldVersion="0.0.0.0-1.2.3.0" newVersion="1.2.3.0" />
-      </dependentAssembly>
-      <dependentAssembly>
-        <assemblyIdentity name="System.Reflection.Metadata" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
-        <bindingRedirect oldVersion="0.0.0.0-1.4.3.0" newVersion="1.4.3.0" />
-      </dependentAssembly>
-      <dependentAssembly>
-        <assemblyIdentity name="Microsoft.AspNetCore.Authorization" publicKeyToken="adb9793829ddae60" culture="neutral" />
-        <bindingRedirect oldVersion="0.0.0.0-2.2.0.0" newVersion="2.2.0.0" />
-      </dependentAssembly>
-      <dependentAssembly>
-        <assemblyIdentity name="Microsoft.AspNetCore.Mvc.ApiExplorer" publicKeyToken="adb9793829ddae60" culture="neutral" />
-        <bindingRedirect oldVersion="0.0.0.0-2.2.0.0" newVersion="2.2.0.0" />
-      </dependentAssembly>
-      <dependentAssembly>
-        <assemblyIdentity name="Microsoft.Extensions.Options" publicKeyToken="adb9793829ddae60" culture="neutral" />
-        <bindingRedirect oldVersion="0.0.0.0-2.2.0.0" newVersion="2.2.0.0" />
-      </dependentAssembly>
-      <dependentAssembly>
-        <assemblyIdentity name="Microsoft.AspNetCore.Mvc.Abstractions" publicKeyToken="adb9793829ddae60" culture="neutral" />
-        <bindingRedirect oldVersion="0.0.0.0-2.2.0.0" newVersion="2.2.0.0" />
-      </dependentAssembly>
-      <dependentAssembly>
-        <assemblyIdentity name="Microsoft.AspNetCore.Mvc.Formatters.Json" publicKeyToken="adb9793829ddae60" culture="neutral" />
-        <bindingRedirect oldVersion="0.0.0.0-2.2.0.0" newVersion="2.2.0.0" />
-      </dependentAssembly>
-      <dependentAssembly>
-        <assemblyIdentity name="Microsoft.AspNetCore.StaticFiles" publicKeyToken="adb9793829ddae60" culture="neutral" />
-        <bindingRedirect oldVersion="0.0.0.0-2.2.0.0" newVersion="2.2.0.0" />
-      </dependentAssembly>
-      <dependentAssembly>
-        <assemblyIdentity name="System.Security.Cryptography.Cng" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
-        <bindingRedirect oldVersion="0.0.0.0-4.3.1.0" newVersion="4.3.1.0" />
-      </dependentAssembly>
-      <dependentAssembly>
-        <assemblyIdentity name="Microsoft.AspNetCore.Server.Kestrel.Transport.Sockets" publicKeyToken="adb9793829ddae60" culture="neutral" />
-        <bindingRedirect oldVersion="0.0.0.0-2.2.1.0" newVersion="2.2.1.0" />
-      </dependentAssembly>
-    </assemblyBinding>
-  </runtime>
-</configuration>
\ No newline at end of file
diff --git a/src/Version/Controllers/VersionController.cs b/src/Version/Controllers/VersionController.cs
index 1b683586fa68f10f5e2906a5929153d2edd89fd1..6beda45b4640090ec913586a6dfeef4d44629f05 100644
--- a/src/Version/Controllers/VersionController.cs
+++ b/src/Version/Controllers/VersionController.cs
@@ -1,8 +1,6 @@
 using Coscine.Configuration;
 using Microsoft.AspNetCore.Mvc;
 using Microsoft.Extensions.Logging;
-using Newtonsoft.Json.Linq;
-using System;
 using System.Collections.Generic;
 using System.Linq;
 
@@ -15,6 +13,7 @@ namespace Coscine.Api.Version.Controllers
     public class VersionController : Controller
     {
         private readonly IConfiguration _configuration;
+        private readonly List<string> _defaultVersions;
 
         /// <summary>
         /// VersionController specifying the configuration.
@@ -23,60 +22,88 @@ namespace Coscine.Api.Version.Controllers
         public VersionController(ILogger<VersionController> logger)
         {
             _configuration = Program.Configuration;
+            _defaultVersions = new List<string> { "apis", "apps", "dlls", "scripts", "sharepoint", "cron" };
+        }
+
+        /// <summary>
+        /// Returns the Versions and Ports for a given type.
+        /// </summary>
+        /// <param name="type">Type of the version.</param>
+        /// <returns>Versions as Json</returns>
+        private List<Dictionary<string, string>> GetEntries(string type)
+        {
+            var infos = new List<Dictionary<string, string>>();
+            try
+            {
+                var fullKeys = _configuration.Keys($"coscine/{type}/");
+                var keys = fullKeys.Select((entry) => entry.Substring(0, entry.LastIndexOf("/") + 1))
+                                        .Distinct().ToArray();
+
+                foreach (var key in keys)
+                {
+                    var version = _configuration.GetString($"{key}version");
+                    var name = _configuration.GetString($"{key}name");
+                    var port = _configuration.GetString($"{key}port");
+
+                    var info = new Dictionary<string, string>
+                    {
+                        { "name" , name },
+                        { "version", version },
+                        { "port", port },
+                    };
+                    infos.Add(info);
+                }
 
+            }
+            catch
+            {
+                return null;
+            }
+            return infos;
         }
 
         /// <summary>
         /// Returns the Versions and Ports 
         /// </summary>
-        /// <returns>Versions as Json</returns>
-        [HttpGet("[controller]/versions")]
-        public IActionResult Versions()
+        /// <returns>Versions an ports of the default list</returns>
+        [HttpGet("[controller]")]
+        public JsonResult Versions()
         {
-            JObject Versions = new JObject();
-            Versions.Add("api", GetEntries("apis"));
-            Versions.Add("app", GetEntries("apps"));
-            Versions.Add("dlls", GetEntries("dlls"));
-            Versions.Add("scripts", GetEntries("scripts"));
-            Versions.Add("sharepoint", GetEntries("sharepoint"));
-            Versions.Add("cron", GetEntries("cron"));
-            return Json(Versions);
+            var versions = new Dictionary<string, List<Dictionary<string, string>>>();
+
+            foreach(var version in _defaultVersions)
+            {
+                var v = GetEntries(version);
+                if(v != null)
+                {
+                    versions.Add(version, v);
+                }
+            }
+
+            return Json(versions);
         }
 
         /// <summary>
         /// This method returns the versions and ports
         /// </summary>
-        /// <param name="name">name </param>
+        /// <param name="applicationType">name </param>
         /// <returns>versions and ports</returns>
-        [Route("[controller]")]
-        public JArray GetEntries(string name)
+        [Route("[controller]/{applicationType}")]
+        public ActionResult Versions(string applicationType)
         {
-            var Infos = new JArray();
-            try { 
-            var stringlist = _configuration.Keys("coscine/" + name + "/");
-            var array = stringlist.Select((entry) => entry.Substring(0, entry.LastIndexOf("/") + 1))
-                                        .Distinct().ToArray();
-     
-                foreach (var entry in array)
-                {
-                    var Version = _configuration.GetString(entry + "version");
-                    var Name = _configuration.GetString(entry + "name");
-                    var Port = _configuration.GetString(entry + "port");
-
-                    var Info = new JObject
-                    {
-                        ["name"] = Name,
-                        ["version"] = Version,
-                        ["port"] = Port
-                    };
-                    Infos.Add(Info);
-                }
-             
+            if (string.IsNullOrWhiteSpace(applicationType))
+            {
+                return BadRequest("Cannot search for empty values.");
             }
-            catch
+
+            var Infos = GetEntries(applicationType);
+
+            if(Infos == null)
             {
+                return NotFound($"Could not find: {applicationType}");
             }
-            return Infos;
+
+            return Json(Infos);
         }
     }
 }
diff --git a/src/Version/LinqToDB.Templates/CopyMe.Access.tt.txt b/src/Version/LinqToDB.Templates/CopyMe.Access.tt.txt
deleted file mode 100644
index 01f9aed963515d8a1ae1cf6e091b0253dae602ae..0000000000000000000000000000000000000000
--- a/src/Version/LinqToDB.Templates/CopyMe.Access.tt.txt
+++ /dev/null
@@ -1,46 +0,0 @@
-<#@ template language="C#" debug="True" hostSpecific="True"                        #>
-<#@ output extension=".generated.cs"                                               #>
-<#@ include file="$(LinqToDBT4AccessTemplatesDirectory)LinqToDB.Access.Tools.ttinclude" #>
-<#@ include file="$(LinqToDBT4AccessTemplatesDirectory)PluralizationService.ttinclude"  #>
-<# //@ include file="$(ProjectDir)LinqToDB.Templates\LinqToDB.Access.Tools.ttinclude" #>
-<# //@ include file="$(ProjectDir)LinqToDB.Templates\PluralizationService.ttinclude"  #>
-<#
-	/*
-		1. Create new *.tt file (e.g. MyDatabase.tt) in a folder where you would like to generate your data model
-		   and copy content from this file to it. For example:
-
-			MyProject
-				DataModels
-					MyDatabase.tt
-
-		2. Modify the connection settings below to connect to your database.
-
-		3. Add connection string to the web/app.config file:
-
-			<connectionStrings>
-				<add name="MyDatabase" providerName="Access"
-					connectionString="Provider=Microsoft.Jet.OLEDB.4.0;Data Source=MyDatabase.mdb;Locale Identifier=1033;Jet OLEDB:Engine Type=5;Persist Security Info=True" />
-			</connectionStrings>
-
-		4. To access your database use the following code:
-
-			using (var db = new MyDatabaseDB())
-			{
-				var q =
-					from c in db.Customers
-					select c;
-
-				foreach (var c in q)
-					Console.WriteLine(c.ContactName);
-			}
-
-		5. See more at https://github.com/linq2db/t4models
-	*/
-
-	NamespaceName = "DataModels";
-
-	LoadAccessMetadata(@"C:\Data", "MyDatabase.mdb");
-//	LoadAccessMetadata(string connectionString);
-
-	GenerateModel();
-#>
diff --git a/src/Version/LinqToDB.Templates/CopyMe.DB2.tt.txt b/src/Version/LinqToDB.Templates/CopyMe.DB2.tt.txt
deleted file mode 100644
index 611011da4fed824c029df80fdab44e53a60b8f49..0000000000000000000000000000000000000000
--- a/src/Version/LinqToDB.Templates/CopyMe.DB2.tt.txt
+++ /dev/null
@@ -1,50 +0,0 @@
-<#@ template language="C#" debug="True" hostSpecific="True"                       #>
-<#@ output extension=".generated.cs"                                              #>
-<#@ include file="$(LinqToDBT4DB2TemplatesDirectory)LinqToDB.DB2.Tools.ttinclude"   #>
-<#@ include file="$(LinqToDBT4DB2TemplatesDirectory)PluralizationService.ttinclude" #>
-<# //@ include file="$(ProjectDir)LinqToDB.Templates\LinqToDB.DB2.Tools.ttinclude"   #>
-<# //@ include file="$(ProjectDir)LinqToDB.Templates\PluralizationService.ttinclude" #>
-<#
-	/*
-		1. Download and install IBM Data Server Provider for .NET.
-
-		2. Add a reference to IBM.Data.DB2.dll.
-
-		3. Create new *.tt file (e.g. MyDatabase.tt) in a folder where you would like to generate your data model
-		   and copy content from this file to it. For example:
-
-			MyProject
-				DataModels
-					MyDatabase.tt
-
-		4. Modify the connection settings below to connect to your database.
-
-		5. Add connection string to the web/app.config file:
-
-			<connectionStrings>
-				<add name="MyDatabase" providerName="DB2"
-					connectionString="Server=MyServer:50000;Database=MyDatabase;UID=MyUser;PWD=TestPassword;" />
-			</connectionStrings>
-
-		6. To access your database use the following code:
-
-			using (var db = new MyDatabaseDB())
-			{
-				var q =
-					from c in db.Customers
-					select c;
-
-				foreach (var c in q)
-					Console.WriteLine(c.ContactName);
-			}
-
-		7. See more at https://github.com/linq2db/t4models
-	*/
-
-	NamespaceName = "DataModels";
-
-	LoadDB2Metadata("MyServer", "50000", "MyDatabase", "MyUser", "TestPassword");
-//	LoadDB2Metadata(string connectionString);
-
-	GenerateModel();
-#>
diff --git a/src/Version/LinqToDB.Templates/CopyMe.Firebird.tt.txt b/src/Version/LinqToDB.Templates/CopyMe.Firebird.tt.txt
deleted file mode 100644
index f3d2559e053ba0ba0340d4e1dcf86f99f610598a..0000000000000000000000000000000000000000
--- a/src/Version/LinqToDB.Templates/CopyMe.Firebird.tt.txt
+++ /dev/null
@@ -1,46 +0,0 @@
-<#@ template language="C#" debug="True" hostSpecific="True"                          #>
-<#@ output extension=".generated.cs"                                                 #>
-<#@ include file="$(LinqToDBT4FirebirdTemplatesDirectory)LinqToDB.Firebird.Tools.ttinclude" #>
-<#@ include file="$(LinqToDBT4FirebirdTemplatesDirectory)PluralizationService.ttinclude"    #>
-<# //@ include file="$(ProjectDir)LinqToDB.Templates\LinqToDB.Firebird.Tools.ttinclude" #>
-<# //@ include file="$(ProjectDir)LinqToDB.Templates\PluralizationService.ttinclude"    #>
-<#
-	/*
-		1. Create new *.tt file (e.g. MyDatabase.tt) in a folder where you would like to generate your data model
-		   and copy content from this file to it. For example:
-
-			MyProject
-				DataModels
-					MyDatabase.tt
-
-		2. Modify the connection settings below to connect to your database.
-
-		3. Add connection string to the web/app.config file:
-
-			<connectionStrings>
-				<add name="MyDatabase" connectionString="DataSource=MyServer;Database=C:\Data\MyDatabase.fdb;User Id=SYSDBA;Password=masterkey" providerName="Firebird" />
-			</connectionStrings>
-
-		4. To access your database use the following code:
-
-			using (var db = new MyDatabaseDB())
-			{
-				var q =
-					from c in db.Customers
-					select c;
-
-				foreach (var c in q)
-					Console.WriteLine(c.ContactName);
-			}
-
-		5. See more at https://github.com/linq2db/t4models
-	*/
-
-	NamespaceName = "DataModels";
-
-	LoadFirebirdMetadata("MyServer", @"C:\Data\MyDatabase.fdb");
-//	LoadFirebirdMetadata(string server, string database, string uid, string password);
-//	LoadFirebirdMetadata(string connectionString);
-
-	GenerateModel();
-#>
diff --git a/src/Version/LinqToDB.Templates/CopyMe.Informix.tt.txt b/src/Version/LinqToDB.Templates/CopyMe.Informix.tt.txt
deleted file mode 100644
index 17acc1fc73fd405e8fc72106fb3859d9f4dc9ce6..0000000000000000000000000000000000000000
--- a/src/Version/LinqToDB.Templates/CopyMe.Informix.tt.txt
+++ /dev/null
@@ -1,51 +0,0 @@
-<#@ template language="C#" debug="True" hostSpecific="True"                          #>
-<#@ output extension=".generated.cs"                                                 #>
-<#@ include file="$(LinqToDBT4InformixTemplatesDirectory)LinqToDB.Informix.Tools.ttinclude" #>
-<#@ include file="$(LinqToDBT4InformixTemplatesDirectory)PluralizationService.ttinclude"    #>
-<# //@ include file="$(ProjectDir)LinqToDB.Templates\LinqToDB.Informix.Tools.ttinclude" #>
-<# //@ include file="$(ProjectDir)LinqToDB.Templates\PluralizationService.ttinclude"    #>
-<#
-	/*
-		1. Download and install IBM Data Server Provider for .NET.
-
-		2. Add a reference to IBM.Data.Informix.dll.
-
-		3. Create new *.tt file (e.g. MyDatabase.tt) in a folder where you would like to generate your data model
-		   and copy content from this file to it. For example:
-
-			MyProject
-				DataModels
-					MyDatabase.tt
-
-		4. Modify the connection settings below to connect to your database.
-
-		5. Add connection string to the web/app.config file:
-
-			<connectionStrings>
-				<add name="MyDatabase"
-					connectionString="Host=MyServer;Service=9088;Server=ol_informix1170;Protocol=onsoctcp;Database=MyDatabase;UID=informix;PWD=TestPassword;"
-					providerName="IBM.Data.Informix"/>
-			</connectionStrings>
-
-		6. To access your database use the following code:
-
-			using (var db = new MyDatabaseDB())
-			{
-				var q =
-					from c in db.Customers
-					select c;
-
-				foreach (var c in q)
-					Console.WriteLine(c.ContactName);
-			}
-
-		7. See more at https://github.com/linq2db/t4models
-	*/
-
-	NamespaceName = "DataModels";
-
-	LoadInformixMetadata("MyServer", "9088", "ol_informix1170", "MyDatabase", "informix", "TestPassword");
-//	LoadInformixMetadata(string connectionString);
-
-	GenerateModel();
-#>
diff --git a/src/Version/LinqToDB.Templates/CopyMe.MySql.tt.txt b/src/Version/LinqToDB.Templates/CopyMe.MySql.tt.txt
deleted file mode 100644
index 173d74fa74253225d96a9fe552999988d1247b1d..0000000000000000000000000000000000000000
--- a/src/Version/LinqToDB.Templates/CopyMe.MySql.tt.txt
+++ /dev/null
@@ -1,45 +0,0 @@
-<#@ template language="C#" debug="True" hostSpecific="True"                       #>
-<#@ output extension=".generated.cs"                                              #>
-<#@ include file="$(LinqToDBT4MySqlTemplatesDirectory)LinqToDB.MySql.Tools.ttinclude" #>
-<#@ include file="$(LinqToDBT4MySqlTemplatesDirectory)PluralizationService.ttinclude" #>
-<# //@ include file="$(ProjectDir)LinqToDB.Templates\LinqToDB.MySql.Tools.ttinclude" #>
-<# //@ include file="$(ProjectDir)LinqToDB.Templates\PluralizationService.ttinclude" #>
-<#
-	/*
-		1. Create new *.tt file (e.g. MyDatabase.tt) in a folder where you would like to generate your data model
-		   and copy content from this file to it. For example:
-
-			MyProject
-				DataModels
-					MyDatabase.tt
-
-		2. Modify the connection settings below to connect to your database.
-
-		3. Add connection string to the web/app.config file:
-
-			<connectionStrings>
-				<add name="MyDatabase" connectionString="Server=MyServer;Port=3306;Database=MyDatabase;Uid=root;Pwd=TestPassword;charset=utf8;" providerName="MySql.Data.MySqlClient" />
-			</connectionStrings>
-
-		4. To access your database use the following code:
-
-			using (var db = new MyDatabaseDB())
-			{
-				var q =
-					from c in db.Customers
-					select c;
-
-				foreach (var c in q)
-					Console.WriteLine(c.ContactName);
-			}
-
-		5. See more at https://github.com/linq2db/t4models
-	*/
-
-	NamespaceName = "DataModels";
-
-	LoadMySqlMetadata("MyServer", "MyDatabase", "root", "TestPassword");
-//	LoadMySqlMetadata(string connectionString);
-
-	GenerateModel();
-#>
diff --git a/src/Version/LinqToDB.Templates/CopyMe.Oracle.tt.txt b/src/Version/LinqToDB.Templates/CopyMe.Oracle.tt.txt
deleted file mode 100644
index 16b17cab5f4bd5b3468af299008663b363e19ea8..0000000000000000000000000000000000000000
--- a/src/Version/LinqToDB.Templates/CopyMe.Oracle.tt.txt
+++ /dev/null
@@ -1,45 +0,0 @@
-<#@ template language="C#" debug="True" hostSpecific="True"                        #>
-<#@ output extension=".generated.cs"                                               #>
-<#@ include file="$(LinqToDBT4OracleTemplatesDirectory)LinqToDB.Oracle.Tools.ttinclude" #>
-<#@ include file="$(LinqToDBT4OracleTemplatesDirectory)PluralizationService.ttinclude"  #>
-<# //@ include file="$(ProjectDir)LinqToDB.Templates\LinqToDB.Oracle.Tools.ttinclude" #>
-<# //@ include file="$(ProjectDir)LinqToDB.Templates\PluralizationService.ttinclude"  #>
-<#
-	/*
-		1. Create new *.tt file (e.g. MyDatabase.tt) in a folder where you would like to generate your data model
-		   and copy content from this file to it. For example:
-
-			MyProject
-				DataModels
-					MyDatabase.tt
-
-		2. Modify the connection settings below to connect to your database.
-
-		3. Add connection string to the web/app.config file:
-
-			<connectionStrings>
-				<add name="MyDatabase" connectionString="Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=MyServer)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=MyDatabase)));User Id=MyUser;Password=MyPassword;" providerName="Oracle" />
-			</connectionStrings>
-
-		4. To access your database use the following code:
-
-			using (var db = new MyDatabaseDB())
-			{
-				var q =
-					from c in db.Customers
-					select c;
-
-				foreach (var c in q)
-					Console.WriteLine(c.ContactName);
-			}
-
-		5. See more at https://github.com/linq2db/t4models
-	*/
-
-	NamespaceName = "DataModels";
-
-	LoadOracleMetadata("MyServer", "1521", "MyDatabase", "MyUser", "MyPassword");
-//	LoadOracleMetadata(string connectionString);
-
-	GenerateModel();
-#>
diff --git a/src/Version/LinqToDB.Templates/CopyMe.PostgreSQL.tt.txt b/src/Version/LinqToDB.Templates/CopyMe.PostgreSQL.tt.txt
deleted file mode 100644
index 801611a896edbc93cd6541eaa45ae2e60cfbf936..0000000000000000000000000000000000000000
--- a/src/Version/LinqToDB.Templates/CopyMe.PostgreSQL.tt.txt
+++ /dev/null
@@ -1,45 +0,0 @@
-<#@ template language="C#" debug="True" hostSpecific="True"                            #>
-<#@ output extension=".generated.cs"                                                   #>
-<#@ include file="$(LinqToDBT4PostgreSQLTemplatesDirectory)LinqToDB.PostgreSQL.Tools.ttinclude" #>
-<#@ include file="$(LinqToDBT4PostgreSQLTemplatesDirectory)PluralizationService.ttinclude"      #>
-<# //@ include file="$(ProjectDir)LinqToDB.Templates\LinqToDB.PostgreSQL.Tools.ttinclude" #>
-<# //@ include file="$(ProjectDir)LinqToDB.Templates\PluralizationService.ttinclude"      #>
-<#
-	/*
-		1. Create new *.tt file (e.g. MyDatabase.tt) in a folder where you would like to generate your data model
-		   and copy content from this file to it. For example:
-
-			MyProject
-				DataModels
-					MyDatabase.tt
-
-		2. Modify the connection settings below to connect to your database.
-
-		3. Add connection string to the web/app.config file:
-
-			<connectionStrings>
-				<add name="MyDatabase" connectionString="Server=MyServer;Port=5432;Database=MyDatabase;User Id=postgres;Password=TestPassword;Pooling=true;MinPoolSize=10;MaxPoolSize=100;Protocol=3;" providerName="PostgreSQL" />
-			</connectionStrings>
-
-		4. To access your database use the following code:
-
-			using (var db = new MyDatabaseDB())
-			{
-				var q =
-					from c in db.Customers
-					select c;
-
-				foreach (var c in q)
-					Console.WriteLine(c.ContactName);
-			}
-
-		5. See more at https://github.com/linq2db/t4models
-	*/
-
-	NamespaceName = "DataModels";
-
-	LoadPostgreSQLMetadata("MyServer", "5432", "MyDatabase", "postgres", "TestPassword");
-//	LoadPostgreSQLMetadata(string connectionString);
-
-	GenerateModel();
-#>
diff --git a/src/Version/LinqToDB.Templates/CopyMe.SQLite.tt.txt b/src/Version/LinqToDB.Templates/CopyMe.SQLite.tt.txt
deleted file mode 100644
index d0d8f08812059acae99cf83bc735018f97f2de3a..0000000000000000000000000000000000000000
--- a/src/Version/LinqToDB.Templates/CopyMe.SQLite.tt.txt
+++ /dev/null
@@ -1,45 +0,0 @@
-<#@ template language="C#" debug="True" hostSpecific="True"                        #>
-<#@ output extension=".generated.cs"                                               #>
-<#@ include file="$(LinqToDBT4SQLiteTemplatesDirectory)LinqToDB.SQLite.Tools.ttinclude" #>
-<#@ include file="$(LinqToDBT4SQLiteTemplatesDirectory)PluralizationService.ttinclude"  #>
-<# //@ include file="$(ProjectDir)LinqToDB.Templates\LinqToDB.SQLite.Tools.ttinclude" #>
-<# //@ include file="$(ProjectDir)LinqToDB.Templates\PluralizationService.ttinclude"  #>
-<#
-	/*
-		1. Create new *.tt file (e.g. MyDatabase.tt) in a folder where you would like to generate your data model
-		   and copy content from this file to it. For example:
-
-			MyProject
-				DataModels
-					MyDatabase.tt
-
-		2. Modify the connection settings below to connect to your database.
-
-		3. Add connection string to the web/app.config file:
-
-			<connectionStrings>
-				<add name="MyDatabase" connectionString="Data Source=MyDatabase.sqlite" providerName="SQLite" />
-			</connectionStrings>
-
-		4. To access your database use the following code:
-
-			using (var db = new MyDatabaseDB())
-			{
-				var q =
-					from c in db.Customers
-					select c;
-
-				foreach (var c in q)
-					Console.WriteLine(c.ContactName);
-			}
-
-		5. See more at https://github.com/linq2db/t4models
-	*/
-
-	NamespaceName = "DataModels";
-
-	LoadSQLiteMetadata(@"C:\Data", "MyDatabase.sqlite");
-//	LoadSQLiteMetadata(string connectionString);
-
-	GenerateModel();
-#>
diff --git a/src/Version/LinqToDB.Templates/CopyMe.SapHana.tt.txt b/src/Version/LinqToDB.Templates/CopyMe.SapHana.tt.txt
deleted file mode 100644
index 7c79bf9e504ab5f80552069e9f34c8cf343f7a78..0000000000000000000000000000000000000000
--- a/src/Version/LinqToDB.Templates/CopyMe.SapHana.tt.txt
+++ /dev/null
@@ -1,49 +0,0 @@
-<#@ template language="C#" debug="True" hostSpecific="True"                         #>
-<#@ output extension=".generated.cs"                                                #>
-<#@ include file="$(LinqToDBT4SapHanaTemplatesDirectory)LinqToDB.SapHana.Tools.ttinclude" #>
-<#@ include file="$(LinqToDBT4SapHanaTemplatesDirectory)PluralizationService.ttinclude"   #>
-<# //@ include file="$(ProjectDir)LinqToDB.Templates\LinqToDB.SapHana.Tools.ttinclude" #>
-<# //@ include file="$(ProjectDir)LinqToDB.Templates\PluralizationService.ttinclude"   #>
-<#
-	/*
-		1. Download and install SapHana data provider for .NET.
-
-		2. Add a reference to Sap.Data.Hana.dll.
-
-		3. Create new *.tt file (e.g. MyDatabase.tt) in a folder where you would like to generate your data model
-		   and copy content from this file to it. For example:
-
-			MyProject
-				DataModels
-					MyDatabase.tt
-
-		4. Modify the connection settings below to connect to your database.
-
-		5. Add connection string to the web/app.config file:
-
-			<connectionStrings>
-				<add name="MyDatabase" connectionString="Server=hanahost:port;Current Schema=TEST;UserID=Test;Password=TestPassword;" providerName="Sap.Data.Hana" />
-			</connectionStrings>
-
-		6. To access your database use the following code:
-
-			using (var db = new MyDatabaseDB())
-			{
-				var q =
-					from c in db.Customers
-					select c;
-
-				foreach (var c in q)
-					Console.WriteLine(c.ContactName);
-			}
-
-		7. See more at https://github.com/linq2db/t4models
-	*/
-
-	NamespaceName = "DataModels";
-
-	LoadSapHanaMetadata("MyServer", "MyDatabase", "TestUser", "TestPassword");
-//	LoadSapHanaMetadata(string connectionString);
-
-	GenerateModel();
-#>
diff --git a/src/Version/LinqToDB.Templates/CopyMe.SqlCe.tt.txt b/src/Version/LinqToDB.Templates/CopyMe.SqlCe.tt.txt
deleted file mode 100644
index 386b3a0b29c496403ff67f1dc7b99ca14b2293bc..0000000000000000000000000000000000000000
--- a/src/Version/LinqToDB.Templates/CopyMe.SqlCe.tt.txt
+++ /dev/null
@@ -1,45 +0,0 @@
-<#@ template language="C#" debug="True" hostSpecific="True"                       #>
-<#@ output extension=".generated.cs"                                              #>
-<#@ include file="$(LinqToDBT4SqlCeTemplatesDirectory)LinqToDB.SqlCe.Tools.ttinclude" #>
-<#@ include file="$(LinqToDBT4SqlCeTemplatesDirectory)PluralizationService.ttinclude" #>
-<# //@ include file="$(ProjectDir)LinqToDB.Templates\LinqToDB.SqlCe.Tools.ttinclude" #>
-<# //@ include file="$(ProjectDir)LinqToDB.Templates\PluralizationService.ttinclude" #>
-<#
-	/*
-		1. Create new *.tt file (e.g. MyDatabase.tt) in a folder where you would like to generate your data model
-		   and copy content from this file to it. For example:
-
-			MyProject
-				DataModels
-					MyDatabase.tt
-
-		2. Modify the connection settings below to connect to your database.
-
-		3. Add connection string to the web/app.config file:
-
-			<connectionStrings>
-				<add name="MyDatabase" connectionString="Data Source=MyDatabase.sdf" providerName="System.Data.SqlServerCe" />
-			</connectionStrings>
-
-		4. To access your database use the following code:
-
-			using (var db = new MyDatabaseDB())
-			{
-				var q =
-					from c in db.Customers
-					select c;
-
-				foreach (var c in q)
-					Console.WriteLine(c.ContactName);
-			}
-
-		5. See more at https://github.com/linq2db/t4models
-	*/
-
-	NamespaceName = "DataModels";
-
-	LoadSqlCeMetadata(@"C:\Data", "MyDatabase.sdf");
-//	LoadSqlCeMetadata(string connectionString);
-
-	GenerateModel();
-#>
diff --git a/src/Version/LinqToDB.Templates/CopyMe.SqlServer.tt.txt b/src/Version/LinqToDB.Templates/CopyMe.SqlServer.tt.txt
deleted file mode 100644
index 891b6b7b8f425a77475c43995b6d0d807b198483..0000000000000000000000000000000000000000
--- a/src/Version/LinqToDB.Templates/CopyMe.SqlServer.tt.txt
+++ /dev/null
@@ -1,56 +0,0 @@
-<#@ template language="C#" debug="True" hostSpecific="True"                           #>
-<#@ output extension=".generated.cs"                                                  #>
-<#@ include file="$(LinqToDBT4SqlServerTemplatesDirectory)LinqToDB.SqlServer.Tools.ttinclude" #>
-<#@ include file="$(LinqToDBT4SqlServerTemplatesDirectory)PluralizationService.ttinclude"     #>
-<# //@ include file="$(ProjectDir)LinqToDB.Templates\LinqToDB.SqlServer.Tools.ttinclude" #>
-<# //@ include file="$(ProjectDir)LinqToDB.Templates\PluralizationService.ttinclude"     #>
-<#
-	/*
-		1. Create new *.tt file (e.g. MyDatabase.tt) in a folder where you would like to generate your data model
-		   and copy content from this file to it. For example:
-
-			MyProject
-				DataModels
-					MyDatabase.tt
-
-		2. Modify the connection settings below to connect to your database.
-
-		3. Add connection string to the web/app.config file:
-
-			<connectionStrings>
-				<add name="MyDatabase" providerName="System.Data.SqlClient"
-					connectionString="Data Source=.;Database=MyDatabase;User Id=User;Password=TestPassword;" />
-			</connectionStrings>
-
-		4. To access your database use the following code:
-
-			using (var db = new MyDatabaseDB())
-			{
-				var q =
-					from c in db.Customers
-					select c;
-
-				foreach (var c in q)
-					Console.WriteLine(c.ContactName);
-			}
-
-		5. See more at https://github.com/linq2db/t4models
-
-		If you need to use the Microsoft.SqlServer.Types namespace, install the Microsoft.SqlServer.Types nuget,
-		and replace the following include at the top of this file:
-
-			"$(ProjectDir)LinqToDB.Templates\LinqToDB.SqlServer.Tools.ttinclude"
-
-		with
-
-			"$(ProjectDir)LinqToDB.Templates\LinqToDB.SqlServer.SqlTypes.Tools.ttinclude"
-	*/
-
-	NamespaceName = "DataModels";
-
-	LoadSqlServerMetadata("MyServer", "MyDatabase", "User", "Password");
-//	LoadSqlServerMetadata(".", "MyDatabase"); // Integrated Security
-//	LoadSqlServerMetadata(string connectionString);
-
-	GenerateModel();
-#>
diff --git a/src/Version/LinqToDB.Templates/CopyMe.Sybase.tt.txt b/src/Version/LinqToDB.Templates/CopyMe.Sybase.tt.txt
deleted file mode 100644
index edbad0dc74d407c83fee3c18a0d08fc5ead3f29f..0000000000000000000000000000000000000000
--- a/src/Version/LinqToDB.Templates/CopyMe.Sybase.tt.txt
+++ /dev/null
@@ -1,49 +0,0 @@
-<#@ template language="C#" debug="True" hostSpecific="True"                        #>
-<#@ output extension=".generated.cs"                                               #>
-<#@ include file="$(LinqToDBT4SybaseTemplatesDirectory)LinqToDB.Sybase.Tools.ttinclude" #>
-<#@ include file="$(LinqToDBT4SybaseTemplatesDirectory)PluralizationService.ttinclude"  #>
-<# //@ include file="$(ProjectDir)LinqToDB.Templates\LinqToDB.Sybase.Tools.ttinclude" #>
-<# //@ include file="$(ProjectDir)LinqToDB.Templates\PluralizationService.ttinclude"  #>
-<#
-	/*
-		1. Download and install Sybase data provider for .NET.
-
-		2. Add a reference to Sybase.AdoNet2(4).AseClient.dll.
-
-		3. Create new *.tt file (e.g. MyDatabase.tt) in a folder where you would like to generate your data model
-		   and copy content from this file to it. For example:
-
-			MyProject
-				DataModels
-					MyDatabase.tt
-
-		4. Modify the connection settings below to connect to your database.
-
-		5. Add connection string to the web/app.config file:
-
-			<connectionStrings>
-				<add name="MyDatabase" connectionString="Data Source=MyServer;Port=5000;Database=MyDatabase;Uid=sa;Password=TestPassword;Charset=utf8;" providerName="Sybase" />
-			</connectionStrings>
-
-		6. To access your database use the following code:
-
-			using (var db = new MyDatabaseDB())
-			{
-				var q =
-					from c in db.Customers
-					select c;
-
-				foreach (var c in q)
-					Console.WriteLine(c.ContactName);
-			}
-
-		7. See more at https://github.com/linq2db/t4models
-	*/
-
-	NamespaceName = "DataModels";
-
-	LoadSybaseMetadata("MyServer", "5000", "MyDatabase", "sa", "TestPassword");
-//	LoadSybaseMetadata(string connectionString);
-
-	GenerateModel();
-#>
diff --git a/src/Version/LinqToDB.Templates/DataAnnotations.ttinclude b/src/Version/LinqToDB.Templates/DataAnnotations.ttinclude
deleted file mode 100644
index a98aea24cf313345913d948297bba0784055801a..0000000000000000000000000000000000000000
--- a/src/Version/LinqToDB.Templates/DataAnnotations.ttinclude
+++ /dev/null
@@ -1,65 +0,0 @@
-<#
-	{
-		var beforeGenerateModel = BeforeGenerateModel;
-		BeforeGenerateModel = () =>
-		{
-			beforeGenerateModel();
-			DataAnnotationsImpl();
-		};
-	}
-#>
-<#+
-void DataAnnotationsImpl()
-{
-	foreach (Class cl in GetTreeNodes(Model).OfType<Class>())
-	{
-		foreach (var p in GetTreeNodes(cl).OfType<Property>())
-		{
-			if (p.DisplayName != null)
-			{
-				p.Attributes.Add(new Attribute("Display", "Name=" + ToStringLiteral(p.DisplayName)) { IsSeparated = true });
-			}
-
-			if (p.IsRequired)
-			{
-				var attr = new Attribute("Required") { IsSeparated = true };
-
-				if (p.IsRequiredMessage != null)
-					attr.Parameters.Add(string.Format("ErrorMessage=" + ToStringLiteral(p.IsRequiredMessage), p.DisplayName ?? p.Name));
-
-				p.Attributes.Add(attr);
-			}
-
-			if (p.StringLength > 0)
-			{
-				var attr = new Attribute("StringLength", p.StringLength.ToString()) { IsSeparated = true };
-
-				if (p.StringLengthMessage != null)
-					attr.Parameters.Add(string.Format("ErrorMessage=" + ToStringLiteral(p.StringLengthMessage), p.DisplayName ?? p.Name));
-
-				p.Attributes.Add(attr);
-
-//				p.Attributes.Add(
-//					new Attribute("StringLength",
-//						p.StringLength.ToString(),
-//						"ErrorMessage=" + ToStringLiteral(string.Format(
-//							"The {0} must be a string with a maximum length of {1}.",
-//							p.DisplayName ?? "field",
-//							p.StringLength)))
-//					{
-//						IsSeparated = true
-//					});
-			}
-		}
-	}
-}
-
-partial class Property
-{
-	public string DisplayName;
-	public bool   IsRequired;
-	public string IsRequiredMessage;
-	public int    StringLength;
-	public string StringLengthMessage;
-}
-#>
diff --git a/src/Version/LinqToDB.Templates/DataModel.ttinclude b/src/Version/LinqToDB.Templates/DataModel.ttinclude
deleted file mode 100644
index b28013d9c981ef4b05570f9207d23fbb95cd44fd..0000000000000000000000000000000000000000
--- a/src/Version/LinqToDB.Templates/DataModel.ttinclude
+++ /dev/null
@@ -1,871 +0,0 @@
-<#@ assembly name="System.Data"                #>
-<#@ import namespace="System.Data"             #>
-<#@ import namespace="LinqToDB.SchemaProvider" #>
-<#@ import namespace="LinqToDB.Data"           #>
-<#@ include file="T4Model.ttinclude"           #>
-<#
-	{
-		var beforeGenerateModel = BeforeGenerateModel;
-		BeforeGenerateModel = () =>
-		{
-			GenerateTypesFromMetadata();
-			beforeGenerateModel();
-		};
-	}
-#><#+
-
-string   NamespaceName
-{
-	get { return Model.Namespace.Name;  }
-	set { Model.Namespace.Name = value; }
-}
-
-string   DatabaseName                  = null;
-string   DataContextName               = null;
-string   BaseDataContextClass          = null;
-string   BaseEntityClass               = null;
-string   OneToManyAssociationType      = "IEnumerable<{0}>";
-
-bool     GenerateDatabaseName          = false;
-bool     GenerateConstructors          = true;
-string   DefaultConfiguration          = null;
-bool     GenerateAssociations          = true;
-bool     GenerateBackReferences        = true;
-bool     GenerateAssociationExtensions = false;
-bool     ReplaceSimilarTables          = true;
-bool     IncludeDefaultSchema          = true;
-
-Class    DataContextObject;
-
-bool PluralizeClassNames                 = false;
-bool SingularizeClassNames               = true;
-bool PluralizeDataContextPropertyNames   = true;
-bool SingularizeDataContextPropertyNames = false;
-
-bool NormalizeNames                      = true;
-
-private Func<string, bool, string> _toValidName;
-Func<string, bool, string> ToValidName
-{
-	get { return _toValidName ?? ToValidNameDefault; }
-	set { _toValidName = value; }
-}
-
-private Func<string, bool, string> _convertToCompilabl;
-Func<string, bool, string> ConvertToCompilable
-{
-	get { return _convertToCompilabl ?? ConvertToCompilableDefault; }
-	set { _convertToCompilabl = value; }
-}
-
-private Func<ForeignKey, string> _getAssociationExtensionPluralName;
-Func<ForeignKey, string> GetAssociationExtensionPluralName
-{
-	get { return _getAssociationExtensionPluralName ?? GetAssociationExtensionPluralNameDefault; }
-	set { _getAssociationExtensionPluralName = value; }
-}
-
-private Func<ForeignKey, string> _getAssociationExtensionSingularName;
-Func<ForeignKey, string> GetAssociationExtensionSinglularName
-{
-	get { return _getAssociationExtensionSingularName ?? GetAssociationExtensionSinglularNameDefault; }
-	set { _getAssociationExtensionSingularName = value; }
-}
-
-LinqToDB.SchemaProvider.GetSchemaOptions GetSchemaOptions =
-	new LinqToDB.SchemaProvider.GetSchemaOptions();
-
-LinqToDB.SqlProvider.ISqlBuilder SqlBuilder;
-
-Func<TableSchema,Table> LoadProviderSpecificTable = tableSchema => null;
-
-static Func<ColumnSchema,string>                 ConvertColumnMemberType          = (c) => c.MemberType;
-static Func<TableSchema,ColumnSchema,string>     ConvertTableColumnMemberType     = (t,c) => ConvertColumnMemberType(c);
-static Func<ProcedureSchema,ColumnSchema,string> ConvertProcedureColumnMemberType = (t,c) => ConvertColumnMemberType(c);
-
-HashSet<string> KeyWords = new HashSet<string>
-{
-	"abstract", "as",       "base",     "bool",    "break",     "byte",     "case",       "catch",     "char",    "checked",
-	"class",    "const",    "continue", "decimal", "default",   "delegate", "do",         "double",    "else",    "enum",
-	"event",    "explicit", "extern",   "false",   "finally",   "fixed",    "float",      "for",       "foreach", "goto",
-	"if",       "implicit", "in",       "int",     "interface", "internal", "is",         "lock",      "long",    "new",
-	"null",     "object",   "operator", "out",     "override",  "params",   "private",    "protected", "public",  "readonly",
-	"ref",      "return",   "sbyte",    "sealed",  "short",     "sizeof",   "stackalloc", "static",    "struct",  "switch",
-	"this",     "throw",    "true",     "try",     "typeof",    "uint",     "ulong",      "unchecked", "unsafe",  "ushort",
-	"using",    "virtual",  "volatile", "void",    "while",     "namespace", "string"
-};
-
-void LoadServerMetadata(DataConnection dataConnection)
-{
-	SqlBuilder = dataConnection.DataProvider.CreateSqlBuilder();
-
-	var sp = dataConnection.DataProvider.GetSchemaProvider();
-	var db = sp.GetSchema(dataConnection, GetSchemaOptions);
-
-	if (DatabaseName == null && GenerateDatabaseName)
-		DatabaseName = db.Database;
-
-	if (DataContextName == null)
-		DataContextObject.Name = DataContextName = ToValidName(db.Database, true) + "DB";
-
-	DataContextObject.Comment.Add("/ <summary>");
-	DataContextObject.Comment.Add("/ Database       : " + db.Database);
-	DataContextObject.Comment.Add("/ Data Source    : " + db.DataSource);
-	DataContextObject.Comment.Add("/ Server Version : " + db.ServerVersion);
-	DataContextObject.Comment.Add("/ </summary>");
-
-	var tables = db.Tables
-		.Where(t => !t.IsProviderSpecific)
-		.Select(t => new
-		{
-			t,
-			key = t.IsDefaultSchema ? t.TableName : t.SchemaName + "." + t.TableName,
-			table = new Table
-			{
-				TableSchema             = t,
-				IsDefaultSchema         = t.IsDefaultSchema,
-				Schema                  = t.IsDefaultSchema && !IncludeDefaultSchema || string.IsNullOrEmpty(t.SchemaName)? null : t.SchemaName,
-				BaseClass               = BaseEntityClass,
-				TableName               = t.TableName,
-				TypeName                = t.TypeName,
-				DataContextPropertyName = t.TypeName,
-				IsView                  = t.IsView,
-				IsProviderSpecific      = false,
-				Description             = t.Description,
-				Columns                 = t.Columns.ToDictionary(
-					c => c.ColumnName,
-					c => new Column
-					{
-						ColumnName      = c.ColumnName,
-						ColumnType      = c.ColumnType,
-						DataType        = "DataType." + c.DataType,
-						Length          = c.Length,
-						Precision       = c.Precision,
-						Scale           = c.Scale,
-						IsNullable      = c.IsNullable,
-						IsIdentity      = c.IsIdentity,
-						IsPrimaryKey    = c.IsPrimaryKey,
-						PrimaryKeyOrder = c.PrimaryKeyOrder,
-						MemberName      = CheckType(c.SystemType, c.MemberName),
-						TypeBuilder     = () => ConvertTableColumnMemberType(t, c),
-						SkipOnInsert    = c.SkipOnInsert,
-						SkipOnUpdate    = c.SkipOnUpdate,
-						Description     = c.Description,
-					})
-			}
-		})
-		.ToList();
-
-	if (PluralizeClassNames || SingularizeClassNames)
-	{
-		var foundNames = new HashSet<string>(tables.Select(t => t.table.Schema + '.' + t.table.TypeName));
-
-		foreach (var t in tables)
-		{
-			var newName = t.table.TypeName;
-				newName =
-					PluralizeClassNames   ? ToPlural  (newName) :
-					SingularizeClassNames ? ToSingular(newName) : newName;
-
-			if (newName != t.table.TypeName)
-			{
-				if (!foundNames.Contains(t.table.Schema + '.' + newName))
-				{
-					t.table.TypeName = newName;
-					foundNames.Add(t.table.Schema + '.' + newName);
-				}
-			}
-		}
-	}
-
-	if (PluralizeDataContextPropertyNames || SingularizeDataContextPropertyNames)
-	{
-		var foundNames = new HashSet<string>(tables.Select(t => t.table.Schema + '.' + t.table.DataContextPropertyName));
-
-		foreach (var t in tables)
-		{
-			var newName = t.table.DataContextPropertyName;
-				newName =
-					PluralizeDataContextPropertyNames   ? ToPlural  (newName) :
-					SingularizeDataContextPropertyNames ? ToSingular(newName) : newName;
-
-			if (newName != t.table.TypeName)
-			{
-				if (!foundNames.Contains(t.table.Schema + '.' + newName))
-				{
-					t.table.DataContextPropertyName = newName;
-					foundNames.Add(t.table.Schema + '.' + newName);
-				}
-			}
-		}
-	}
-
-	tables.AddRange(db.Tables
-		.Where(t => t.IsProviderSpecific)
-		.Select(t => new
-		{
-			t,
-			key = t.IsDefaultSchema ? t.TableName : t.SchemaName + "." + t.TableName,
-			table = LoadProviderSpecificTable(t)
-		})
-		.Where(t => t.table != null));
-
-	foreach (var t in tables)
-		Tables.Add(t.key, t.table);
-
-	var keys =
-	(
-		from t in tables
-		from k in t.t.ForeignKeys
-		let otherTable = tables.Where(tbl => tbl.t == k.OtherTable).Select(tbl => tbl.table).Single()
-		select new
-		{
-			k,
-			k.KeyName,
-			t,
-			key = new ForeignKey
-			{
-				KeyName         = k.KeyName,
-				OtherTable      = otherTable,
-				OtherColumns    = k.OtherColumns.Select(c => otherTable.Columns[c.ColumnName]).ToList(),
-				ThisColumns     = k.ThisColumns. Select(c => t.table.   Columns[c.ColumnName]).ToList(),
-				CanBeNull       = k.CanBeNull,
-				MemberName      = k.MemberName,
-				AssociationType = (AssociationType)(int)k.AssociationType,
-			}
-		}
-	).ToList();
-
-	foreach (var key in keys)
-	{
-		key.t.table.ForeignKeys.Add(
-			key.k.OtherTable.IsDefaultSchema ? key.KeyName : key.k.OtherTable.SchemaName + "." + key.KeyName,
-			key.key);
-
-		if (key.k.BackReference != null)
-			key.key.BackReference = keys.First(k => k.k == key.k.BackReference).key;
-
-		key.key.MemberName = key.key.MemberName.Replace(".", string.Empty);
-
-		key.key.MemberName = key.key.AssociationType == AssociationType.OneToMany ?
-			ToPlural(key.key.MemberName) : ToSingular(key.key.MemberName);
-	}
-
-	var procedures = db.Procedures
-		.Select(p => new
-		{
-			p,
-			key = p.IsDefaultSchema ? p.ProcedureName : p.SchemaName + "." + p.ProcedureName,
-			proc = new Procedure
-			{
-				Schema              = (p.IsDefaultSchema && !IncludeDefaultSchema) || string.IsNullOrEmpty(p.SchemaName)? null : p.SchemaName,
-				ProcedureName       = p.ProcedureName,
-				Name                = ToValidName(p.MemberName, true),
-				IsFunction          = p.IsFunction,
-				IsTableFunction     = p.IsTableFunction,
-				IsAggregateFunction = p.IsAggregateFunction,
-				IsDefaultSchema     = p.IsDefaultSchema,
-				IsLoaded            = p.IsLoaded,
-				ResultTable         = p.ResultTable == null ? null :
-					new Table
-					{
-						TypeName = ToValidName(
-							PluralizeClassNames   ? ToPlural  (p.ResultTable.TypeName) :
-							SingularizeClassNames ? ToSingular(p.ResultTable.TypeName) : p.ResultTable.TypeName, true),
-						Columns  = ToDictionary(
-							p.ResultTable.Columns,
-							c => c.ColumnName,
-							c => new Column
-							{
-								ColumnName      = c.ColumnName,
-								ColumnType      = c.ColumnType,
-								IsNullable      = c.IsNullable,
-								IsIdentity      = c.IsIdentity,
-								IsPrimaryKey    = c.IsPrimaryKey,
-								PrimaryKeyOrder = c.PrimaryKeyOrder,
-								MemberName      = CheckColumnName(CheckType(c.SystemType, c.MemberName)),
-								TypeBuilder     = () => ConvertProcedureColumnMemberType(p, c),
-								SkipOnInsert    = c.SkipOnInsert,
-								SkipOnUpdate    = c.SkipOnUpdate,
-								Description     = c.Description,
-							},
-							(c,n) =>
-							{
-								c.IsDuplicateOrEmpty = true;
-								return "$" + (c.MemberName = "Column" + n);
-							})
-					},
-				ResultException = p.ResultException,
-				SimilarTables   = p.SimilarTables == null ? new List<Table>() :
-					p.SimilarTables
-						.Select(t => tables.Single(tbl => tbl.t == t).table)
-						.ToList(),
-				ProcParameters  = p.Parameters
-					.Select(pr => new Parameter
-					{
-						SchemaName    = pr.SchemaName,
-						SchemaType    = pr.SchemaType,
-						IsIn          = pr.IsIn,
-						IsOut         = pr.IsOut,
-						IsResult      = pr.IsResult,
-						Size          = pr.Size,
-						ParameterName = CheckParameterName(CheckType(pr.SystemType, pr.ParameterName)),
-						ParameterType = pr.ParameterType,
-						SystemType    = pr.SystemType,
-						DataType      = pr.DataType.ToString(),
-					})
-					.ToList(),
-			}
-		})
-		.ToList();
-
-	foreach (var p in procedures)
-	{
-		if (ReplaceSimilarTables)
-			if (p.proc.SimilarTables.Count() == 1 || p.proc.SimilarTables.Count(t => !t.IsView) == 1)
-				p.proc.ResultTable = p.proc.SimilarTables.Count() == 1 ?
-					p.proc.SimilarTables[0] :
-					p.proc.SimilarTables.First(t => !t.IsView);
-
-		Procedures[p.key] = p.proc;
-	}
-}
-
-Dictionary<string,TR> ToDictionary<T,TR>(IEnumerable<T> source, Func<T,string> keyGetter, Func<T,TR> objGetter, Func<TR,int,string> getKeyName)
-{
-	var dic     = new Dictionary<string,TR>();
-	var current = 1;
-
-	foreach (var item in source)
-	{
-		var key = keyGetter(item);
-		var obj = objGetter(item);
-
-		if (string.IsNullOrEmpty(key) || dic.ContainsKey(key))
-			key = getKeyName(obj, current);
-
-		dic.Add(key, obj);
-
-		current++;
-	}
-
-	return dic;
-}
-
-string CheckType(Type type, string typeName)
-{
-	if (!Model.Usings.Contains(type.Namespace))
-		Model.Usings.Add(type.Namespace);
-	return typeName;
-}
-
-string CheckColumnName(string memberName)
-{
-	if (string.IsNullOrEmpty(memberName))
-		memberName = "Empty";
-	else
-	{
-		memberName = memberName
-			.Replace("%", "Percent")
-			.Replace(">", "Greater")
-			.Replace("<", "Lower")
-			.Replace("+", "Plus")
-			.Replace('(', '_')
-			.Replace(')', '_')
-			.Replace('-', '_')
-			.Replace('|', '_')
-			.Replace(',', '_')
-			.Replace('"', '_')
-			.Replace("'", "_")
-			.Replace(".", "_")
-			.Replace("\u00A3", "Pound");
-
-		if (KeyWords.Contains(memberName))
-			memberName = "@" + memberName;
-	}
-	return memberName;
-}
-
-string CheckParameterName(string parameterName)
-{
-	var invalidParameterNames = new List<string>
-	{
-		"@DataType"
-	};
-
-	var result = parameterName;
-	while (invalidParameterNames.Contains(result))
-	{
-		result = result + "_";
-	}
-	return result;
-}
-
-Action AfterLoadMetadata = () => {};
-
-void LoadMetadata(DataConnection dataConnection)
-{
-	if (DataContextObject == null)
-	{
-		DataContextObject = new Class(DataContextName) { BaseClass = BaseDataContextClass, };
-
-		Model.Types.Add(DataContextObject);
-	}
-
-	LoadServerMetadata(dataConnection);
-
-	if (Tables.Values.SelectMany(_ => _.ForeignKeys.Values).Any(_ => _.AssociationType == AssociationType.OneToMany))
-		Model.Usings.Add("System.Collections.Generic");
-
-	foreach (var t in Tables.Values)
-	{
-		if (KeyWords.Contains(t.TypeName))
-			t.TypeName = "@" + t.TypeName;
-
-		if (KeyWords.Contains(t.DataContextPropertyName))
-			t.DataContextPropertyName = "@" + t.DataContextPropertyName;
-
-		t.TypeName                = ConvertToCompilable(t.TypeName,                true);
-		t.DataContextPropertyName = ConvertToCompilable(t.DataContextPropertyName, true);
-
-		foreach (var col in t.Columns.Values)
-		{
-			if (KeyWords.Contains(col.MemberName))
-				col.MemberName = "@" + col.MemberName;
-
-			col.MemberName = ConvertToCompilable(col.MemberName, true);
-
-			if (col.MemberName == t.TypeName)
-				col.MemberName += "_Column";
-		}
-
-		foreach (var fk in t.ForeignKeys.Values)
-		{
-			if (KeyWords.Contains(fk.MemberName))
-				fk.MemberName = "@" + fk.MemberName;
-
-			fk.MemberName = ConvertToCompilable(fk.MemberName, true);
-
-			if (fk.MemberName == t.TypeName)
-				fk.MemberName += "_FK";
-		}
-	}
-
-	foreach (var t in Tables.Values)
-	{
-		var hasDuplicates = t.Columns.Values
-				.Select(c => c.MemberName)
-				.Concat(t.ForeignKeys.Values.Select(f => f.MemberName))
-				.ToLookup(n => n)
-				.Any(g => g.Count() > 1);
-
-		if (hasDuplicates)
-		{
-			foreach (var fk in t.ForeignKeys.Values)
-			{
-				var mayDuplicate = t.Columns.Values
-					.Select(c => c.MemberName)
-					.Concat(t.ForeignKeys.Values.Where(f => f != fk).Select(f => f.MemberName));
-
-				fk.MemberName = SuggestNoDuplicate(mayDuplicate, fk.MemberName, "FK");
-			}
-
-			foreach (var col in t.Columns.Values)
-			{
-				var mayDuplicate = t.Columns.Values
-					.Where(c => c != col)
-					.Select(c => c.MemberName)
-					.Concat(t.ForeignKeys.Values.Select(fk => fk.MemberName));
-
-				col.MemberName = SuggestNoDuplicate(mayDuplicate, col.MemberName, null);
-			}
-		}
-	}
-
-	foreach (var proc in Procedures.Values)
-	{
-	    proc.Name = ConvertToCompilable(proc.Name, false);
-
-		if (KeyWords.Contains(proc.Name))
-			proc.Name = "@" + proc.Name;
-
-		foreach (var param in proc.ProcParameters)
-		{
-			if (KeyWords.Contains(param.ParameterName))
-				param.ParameterName = ConvertToCompilable("@" + param.ParameterName, true);
-		}
-	}
-
-	AfterLoadMetadata();
-}
-
-string SuggestNoDuplicate(IEnumerable<string> currentNames, string newName, string prefix)
-{
-	var names = new HashSet<string>(currentNames);
-	var result = newName;
-	if (names.Contains(result))
-	{
-		if (!string.IsNullOrEmpty(prefix))
-			result = prefix + result;
-		if (names.Contains(result))
-		{
-			var counter = 0;
-			var number = string.Concat(result.Reverse().Take(6).TakeWhile(c => Char.IsDigit(c)).Reverse());
-			if (!string.IsNullOrEmpty(number))
-			{
-				if (int.TryParse(number, out counter))
-				{
-					result = result.Remove(result.Length - number.Length);
-				}
-			}
-
-			do
-			{
-				++counter;
-				if (!names.Contains(result + counter))
-				{
-					result = result + counter;
-					break;
-				}
-			}
-			while(true);
-		}
-	}
-
-	return result;
-}
-
-string ConvertToCompilableDefault(string name, bool mayRemoveUnderscore)
-{
-	var query =
-		from c in name
-		select char.IsLetterOrDigit(c) || c == '@' ? c : '_';
-
-	return ToValidName(new string(query.ToArray()), mayRemoveUnderscore);
-}
-
-Table GetTable(string name)
-{
-	Table tbl;
-
-	if (Tables.TryGetValue(name, out tbl))
-		return tbl;
-
-	WriteLine("#error Table '" + name +  "' not found.");
-	WriteLine("/*");
-	WriteLine("\tExisting tables:");
-	WriteLine("");
-
-	foreach (var key in Tables.Keys)
-		WriteLine("\t" + key);
-
-	WriteLine(" */");
-
-	throw new ArgumentException("Table '" + name +  "' not found.");
-}
-
-Procedure GetProcedure(string name)
-{
-	Procedure proc;
-
-	if (Procedures.TryGetValue(name, out proc))
-		return proc;
-
-	WriteLine("#error Procedure '" + name +  "' not found.");
-	WriteLine("");
-	WriteLine("/*");
-	WriteLine("\tExisting procedures:");
-	WriteLine("");
-
-	foreach (var key in Procedures.Keys)
-		WriteLine("\t" + key);
-
-	WriteLine(" */");
-
-	throw new ArgumentException("Procedure '" + name +  "' not found.");
-}
-
-Column GetColumn(string tableName, string columnName)
-{
-	var tbl = GetTable(tableName);
-
-	Column col;
-
-	if (tbl.Columns.TryGetValue(columnName, out col))
-		return col;
-
-	WriteLine("#error Column '" + tableName + "'.'" + columnName +  "' not found.");
-	WriteLine("");
-	WriteLine("/*");
-	WriteLine("\tExisting '" + tableName + "'columns:");
-	WriteLine("");
-
-	foreach (var key in tbl.Columns.Keys)
-		WriteLine("\t" + key);
-
-	WriteLine(" */");
-
-	throw new ArgumentException("Column '" + tableName + "'.'" + columnName +  "' not found.");
-}
-
-ForeignKey GetFK(string tableName, string fkName)
-{
-	return GetForeignKey(tableName, fkName);
-}
-
-ForeignKey GetForeignKey(string tableName, string fkName)
-{
-	var tbl = GetTable(tableName);
-
-	ForeignKey col;
-
-	if (tbl.ForeignKeys.TryGetValue(fkName, out col))
-		return col;
-
-	WriteLine("#error FK '" + tableName + "'.'" + fkName +  "' not found.");
-	WriteLine("");
-	WriteLine("/*");
-	WriteLine("\tExisting '" + tableName + "'FKs:");
-	WriteLine("");
-
-	foreach (var key in tbl.ForeignKeys.Keys)
-		WriteLine("\t" + key);
-
-	WriteLine(" */");
-
-	throw new ArgumentException("FK '" + tableName + "'.'" + fkName +  "' not found.");
-}
-
-
-public TableContext SetTable(string tableName,
-	string TypeName                = null,
-	string DataContextPropertyName = null)
-{
-	var ctx = new TableContext { Transformation = this, TableName = tableName };
-
-	if (TypeName != null || DataContextPropertyName != null)
-	{
-		var t = GetTable(tableName);
-
-		if (TypeName                != null) t.TypeName                = TypeName;
-		if (DataContextPropertyName != null) t.DataContextPropertyName = DataContextPropertyName;
-	}
-
-	return ctx;
-}
-
-public class TableContext
-{
-	public GeneratedTextTransformation Transformation;
-	public string                      TableName;
-
-	public TableContext Column(string columnName,
-		string MemberName  = null,
-		string Type        = null,
-		bool?  IsNullable  = null,
-		string Conditional = null)
-	{
-		var c = Transformation.GetColumn(TableName, columnName);
-
-		if (MemberName  != null) c.MemberName  = MemberName;
-		if (Type        != null) c.TypeBuilder = () => Type;
-		if (IsNullable  != null) c.IsNullable  = IsNullable.Value;
-		if (Conditional != null) c.Conditional = Conditional;
-
-		return this;
-	}
-
-	public TableContext FK(string fkName,
-		string           MemberName      = null,
-		AssociationType? AssociationType = null,
-		bool?            CanBeNull       = null)
-	{
-		var c = Transformation.GetFK(TableName, fkName);
-
-		if (MemberName      != null) c.MemberName      = MemberName;
-		if (AssociationType != null) c.AssociationType = AssociationType.Value;
-		if (CanBeNull       != null) c.CanBeNull       = CanBeNull.Value;
-
-		return this;
-	}
-}
-
-
-Dictionary<string,Table>     Tables     = new Dictionary<string,Table>    ();
-Dictionary<string,Procedure> Procedures = new Dictionary<string,Procedure>();
-
-public partial class Table : Class
-{
-	public TableSchema TableSchema             { get; set; }
-	public string      Schema                  { get; set; }
-	public string      TableName               { get; set; }
-	public string      DataContextPropertyName { get; set; }
-	public MemberBase  DataContextProperty     { get; set; }
-	public bool        IsView                  { get; set; }
-	public bool        IsProviderSpecific      { get; set; }
-	public bool        IsDefaultSchema         { get; set; }
-	public string      Description             { get; set; }
-	public string      AliasPropertyName       { get; set; }
-	public string      AliasTypeName           { get; set; }
-	public string      TypePrefix              { get; set; }
-
-	public string TypeName
-	{
-		get { return Name;  }
-		set { Name = value; }
-	}
-
-	public Dictionary<string,Column>     Columns;
-	public Dictionary<string,ForeignKey> ForeignKeys = new Dictionary<string,ForeignKey>();
-}
-
-public partial class Column : Property
-{
-	public string    ColumnName; // Column name in database
-	public bool      IsNullable;
-	public bool      IsIdentity;
-	public string    ColumnType; // Type of the column in database
-	public string    DataType;
-	public long?     Length;
-	public int?      Precision;
-	public int?      Scale;
-	public DbType    DbType;
-	public string    Description;
-	public bool      IsPrimaryKey;
-	public int       PrimaryKeyOrder;
-	public bool      SkipOnUpdate;
-	public bool      SkipOnInsert;
-	public bool      IsDuplicateOrEmpty;
-	public bool      IsDiscriminator;
-	public string    AliasName;
-
-	public string MemberName
-	{
-		get { return Name;  }
-		set { Name = value; }
-	}
-}
-
-public enum AssociationType
-{
-	Auto,
-	OneToOne,
-	OneToMany,
-	ManyToOne,
-}
-
-public partial class ForeignKey : Property
-{
-	public string       KeyName;
-	public Table        OtherTable;
-	public List<Column> ThisColumns;
-	public List<Column> OtherColumns;
-	public bool         CanBeNull;
-	public ForeignKey   BackReference;
-
-	public string MemberName
-	{
-		get { return Name;  }
-		set { Name = value; }
-	}
-
-	private AssociationType _associationType = AssociationType.Auto;
-	public  AssociationType  AssociationType
-	{
-		get { return _associationType; }
-		set
-		{
-			_associationType = value;
-
-			if (BackReference != null)
-			{
-				switch (value)
-				{
-					case AssociationType.Auto      : BackReference.AssociationType = AssociationType.Auto;      break;
-					case AssociationType.OneToOne  : BackReference.AssociationType = AssociationType.OneToOne;  break;
-					case AssociationType.OneToMany : BackReference.AssociationType = AssociationType.ManyToOne; break;
-					case AssociationType.ManyToOne : BackReference.AssociationType = AssociationType.OneToMany; break;
-				}
-			}
-		}
-	}
-}
-
-public partial class Procedure : Method
-{
-	public string Schema              { get; set; }
-	public string ProcedureName       { get; set; }
-	public bool   IsFunction          { get; set; }
-	public bool   IsTableFunction     { get; set; }
-	public bool   IsAggregateFunction { get; set; }
-	public bool   IsDefaultSchema     { get; set; }
-	public bool   IsLoaded            { get; set; }
-
-	public Table           ResultTable     { get; set; }
-	public Exception       ResultException { get; set; }
-	public List<Table>     SimilarTables   { get; set; }
-	public List<Parameter> ProcParameters  { get; set; }
-}
-
-public class Parameter
-{
-	public string   SchemaName    { get; set; }
-	public string   SchemaType    { get; set; }
-	public bool     IsIn          { get; set; }
-	public bool     IsOut         { get; set; }
-	public bool     IsResult      { get; set; }
-	public long?    Size          { get; set; }
-
-	public string   ParameterName { get; set; }
-	public string   ParameterType { get; set; }
-	public Type     SystemType    { get; set; }
-	public string   DataType      { get; set; }
-}
-
-private int _counter = 0;
-
-string ToValidNameDefault(string name, bool mayRemoveUnderscore)
-{
-	if (NormalizeNames && mayRemoveUnderscore && name.Contains("_"))
-	{
-		name = SplitAndJoin(name, "", '_');
-	}
-
-	if (name.Contains("."))
-	{
-		name = SplitAndJoin(name, "", '.');
-	}
-
-	if (name.Length > 0 && char.IsDigit(name[0]))
-		name = "_" + name;
-
-	if (string.IsNullOrEmpty(name))
-		name = "_" + _counter++;
-
-	if (NormalizeNames)
-	{
-		name = char.ToUpper(name[0]) + name.Substring(1);
-	}
-
-	return name;
-}
-
-static string SplitAndJoin(string value, string join, params char[] split)
-{
-	var ss = value.Split(split, StringSplitOptions.RemoveEmptyEntries)
-		.Select(s => char.ToUpper(s[0]) + (s.Substring(1).All(char.IsUpper) ? s.Substring(1).ToLower() : s.Substring(1)));
-
-	return string.Join(join, ss.ToArray());
-}
-
-private string GetAssociationExtensionSinglularNameDefault(ForeignKey key)
-{
-	return ToSingular(key.Name);
-}
-
-private string GetAssociationExtensionPluralNameDefault(ForeignKey key)
-{
-	return ToPlural(ToSingular(key.Name));
-}
-
-#>
diff --git a/src/Version/LinqToDB.Templates/EditableObject.ttinclude b/src/Version/LinqToDB.Templates/EditableObject.ttinclude
deleted file mode 100644
index e9506c2a27020962e7fe38b07be4972479478707..0000000000000000000000000000000000000000
--- a/src/Version/LinqToDB.Templates/EditableObject.ttinclude
+++ /dev/null
@@ -1,250 +0,0 @@
-<#
-	{
-		var beforeGenerateModel = BeforeGenerateModel;
-		BeforeGenerateModel = () =>
-		{
-			EditableObjectImpl();
-			beforeGenerateModel();
-		};
-
-		SetPropertyValueAction += (obj,prop,val) =>
-		{
-			if (prop == "IsEditable")
-				obj.IsEditable = (bool)val;
-		};
-	}
-#>
-<#+
-void EditableObjectImpl()
-{
-	foreach (Property prop in GetTreeNodes(Model).OfType<Property>().Where(p => p.IsEditable).ToList())
-	{
-		SetPropertyValue(prop, "IsNotifying", true);
-
-		List<IClassMember> parentMembers;
-
-		MemberGroup gr = null;
-
-		if (prop.Parent is Class)
-		{
-			var parent = (Class)prop.Parent;
-			parentMembers = parent.Members;
-		}
-		else
-		{
-			var parent = (MemberGroup)prop.Parent;
-			parentMembers = parent.Members;
-
-			parent.IsCompact = false;
-		}
-
-		var name = prop.Name.Trim();
-		var type = prop.BuildType().Trim();
-
-		if (gr == null)
-		{
-			gr = new MemberGroup
-			{
-				Region          = name + " : " + type,
-				Members         = { prop },
-				IsPropertyGroup = true,
-			};
-
-			var index = parentMembers.IndexOf(prop);
-
-			parentMembers.RemoveAt(index);
-			parentMembers.Insert  (index, gr);
-		}
-
-		var originalField = new Field(() => type, "_original" + name)
-		{
-			AccessModifier       = AccessModifier.Private,
-			InsertBlankLineAfter = false,
-		};
-
-		gr.Members.Insert(0, originalField);
-
-		var currentField = new Field(() => type, " _current" + name)
-		{
-			AccessModifier       = AccessModifier.Private,
-			InsertBlankLineAfter = false,
-		};
-
-		if (prop.InitValue != null)
-			currentField.InitValue = prop.InitValue;
-
-		gr.Members.Insert(0, currentField);
-
-		prop.Name        = "         " + name;
-		prop.TypeBuilder = () => " " + type;
-		prop.IsAuto      = false;
-
-		if (prop.HasGetter) prop.GetBodyBuilders.Add(() => new [] { "return " + currentField.Name.Trim() + ";" });
-		if (prop.HasSetter) prop.SetBodyBuilders.Add(() => new [] { currentField.Name.Trim() + " = value;" });
-
-		var ac = new Method  (() => "void", "Accept" + name + "Changes", null, () => new[] { string.Format("_original{0} = _current{0};", name) });
-		var rc = new Method  (() => "void", "Reject" + name + "Changes", null, () => new[] { string.Format("{0} = _original{0};", name) });
-		var id = new Property(() => "bool", "Is" + name + "Dirty")
-			.InitGetter(() => new [] { string.Format(prop.IsDirtyText, "_current" + name, "_original" + name) });
-
-		gr.Members.Add(new MemberGroup
-		{
-			Region  = "EditableObject support",
-			Members = { ac, rc, id },
-		});
-
-		prop.Parent.SetTree();
-	}
-
-	foreach (Class cl in GetTreeNodes(Model).OfType<Class>())
-	{
-		var props = GetTreeNodes(cl).OfType<Property>().Where(p => p.IsEditable).ToList();
-
-		if (props.Count > 0)
-		{
-			if (props.Any(p => p.IsEditable))
-			{
-				var ctor = GetTreeNodes(cl)
-					.OfType<Method>()
-					.FirstOrDefault(m => m.Name == cl.Name && m.ParameterBuilders.Count == 0);
-
-				if (ctor == null)
-				{
-					ctor = new Method(null, cl.Name);
-					cl.Members.Insert(0, ctor);
-				}
-
-				ctor.BodyBuilders.Add(() => new [] { "AcceptChanges();" });
-			}
-
-			var maxLen = props.Max(p => p.Name.Trim().Length);
-
-			var ac = new Method(() => "void", "AcceptChanges") { IsVirtual = true };
-			var rc = new Method(() => "void", "RejectChanges") { IsVirtual = true };
-			var id = new Property(() => "bool", "IsDirty") { IsAuto = false, HasSetter = false, IsVirtual = true };
-
-			ac.BodyBuilders.Add(() => new []
-			{
-				"BeforeAcceptChanges();",
-				""
-			});
-			rc.BodyBuilders.Add(() => new []
-			{
-				"BeforeRejectChanges();",
-				""
-			});
-			id.GetBodyBuilders.Add(() => new [] { "return" });
-
-			foreach (var p in props)
-			{
-				var name = p.Name.Trim();
-
-				ac.BodyBuilders.Add(() => new [] { string.Format("Accept{0}Changes();", name) });
-				rc.BodyBuilders.Add(() => new [] { string.Format("Reject{0}Changes();", name) });
-				id.GetBodyBuilders.Add(() => new [] { string.Format("\tIs{0}Dirty{1} ||", name, LenDiff(maxLen, name)) });
-			}
-
-			ac.BodyBuilders.Add(() => new[]
-			{
-				"",
-				"AfterAcceptChanges();"
-			});
-			rc.BodyBuilders.Add(() => new[]
-			{
-				"",
-				"AfterRejectChanges();"
-			});
-			var getBody = id.BuildGetBody().ToArray();
-			getBody[getBody.Length - 1] = getBody[getBody.Length - 1].Trim(' ' , '|') + ";";
-			id.GetBodyBuilders.Clear();
-			id.GetBodyBuilders.Add(() => getBody);
-
-			cl.Members.Add(new MemberGroup
-			{
-				Region  = "EditableObject support",
-				Members =
-				{
-					new MemberGroup
-					{
-						IsCompact = true,
-						Members   =
-						{
-							new Method(() => "void", "BeforeAcceptChanges") { AccessModifier = AccessModifier.Partial },
-							new Method(() => "void", "AfterAcceptChanges")  { AccessModifier = AccessModifier.Partial },
-						}
-					},
-					ac,
-					new MemberGroup
-					{
-						IsCompact = true,
-						Members   =
-						{
-							new Method(() => "void", "BeforeRejectChanges") { AccessModifier = AccessModifier.Partial },
-							new Method(() => "void", "AfterRejectChanges")  { AccessModifier = AccessModifier.Partial },
-						}
-					},
-					rc,
-					id
-				},
-			});
-
-			if (!cl.Interfaces.Contains("IEditableObject"))
-			{
-				if (!Model.Usings.Contains("System.ComponentModel"))
-					Model.Usings.Add("System.ComponentModel");
-
-				cl.Interfaces.Add("IEditableObject");
-
-				cl.Members.Add(new MemberGroup
-				{
-					Region  = "IEditableObject support",
-					Members =
-					{
-						new MemberGroup
-						{
-							IsCompact = true,
-							Members   =
-							{
-								new Field   (() => "bool", "_isEditing") { AccessModifier = AccessModifier.Private },
-								new Property(() => "bool", " IsEditing").InitGetter(() => new [] { "_isEditing" }),
-							}
-						},
-						new MemberGroup
-						{
-							IsCompact = true,
-							Members   =
-							{
-								new Method(() => "void", "BeginEdit",  null, () => new[] { "AcceptChanges();", "_isEditing = true;"   }) { IsVirtual = true },
-								new Method(() => "void", "CancelEdit", null, () => new[] { "_isEditing = false;", "RejectChanges();", }) { IsVirtual = true },
-								new Method(() => "void", "EndEdit",    null, () => new[] { "_isEditing = false;", "AcceptChanges();", }) { IsVirtual = true },
-							}
-						},
-					}
-				});
-			}
-		}
-
-		cl.SetTree();
-	}
-}
-
-partial class Property
-{
-	public bool   IsEditable;
-	public string IsDirtyText = "{0} != {1}";
-}
-
-class EditableProperty : Property
-{
-	public EditableProperty()
-	{
-		IsEditable = true;
-	}
-
-	public EditableProperty(string type, string name)
-		: base(() => type, name, null, null)
-	{
-		IsEditable = true;
-	}
-}
-#>
diff --git a/src/Version/LinqToDB.Templates/Humanizer.ttinclude b/src/Version/LinqToDB.Templates/Humanizer.ttinclude
deleted file mode 100644
index 17be0916cc74e01a29558a7cd6013fe567aa1409..0000000000000000000000000000000000000000
--- a/src/Version/LinqToDB.Templates/Humanizer.ttinclude
+++ /dev/null
@@ -1,15 +0,0 @@
-<#
-/*
-To use this extension you should:
-1) Reference Humanizer NuGet package into your project
-2) Include Humanizer.ttinclude
-3) Reference assembly like <_#@ assembly name="$(SolutionDir)\packages\Humanizer.Core.2.2.0\lib\netstandard1.0\Humanizer.dll" #_>
-*/
-#>
-<#@ import namespace="Humanizer" #>
-<#
-	NormalizeNames = true;
-	ToPlural       = s => s.Pluralize  (inputIsKnownToBeSingular: false);
-	ToSingular     = s => s.Singularize(inputIsKnownToBePlural:   false);
-	ToValidName    = (s, r) => s.Pascalize();
-#>
diff --git a/src/Version/LinqToDB.Templates/LinqToDB.Access.Tools.ttinclude b/src/Version/LinqToDB.Templates/LinqToDB.Access.Tools.ttinclude
deleted file mode 100644
index ebabf0fb9054ec5336c069f94297ed81ea95e1f4..0000000000000000000000000000000000000000
--- a/src/Version/LinqToDB.Templates/LinqToDB.Access.Tools.ttinclude
+++ /dev/null
@@ -1,2 +0,0 @@
-<#@ include file="LinqToDB.Tools.ttinclude" #>
-<#@ include file="LinqToDB.Access.ttinclude" #>
diff --git a/src/Version/LinqToDB.Templates/LinqToDB.Access.ttinclude b/src/Version/LinqToDB.Templates/LinqToDB.Access.ttinclude
deleted file mode 100644
index 806e50298187b6c2bccde49d7a3ee4f52673b8d1..0000000000000000000000000000000000000000
--- a/src/Version/LinqToDB.Templates/LinqToDB.Access.ttinclude
+++ /dev/null
@@ -1,26 +0,0 @@
-<#@ include file="LinqToDB.ttinclude" #>
-<#+
-LinqToDB.Data.DataConnection GetAccessConnection(string connectionString)
-{
-	return LinqToDB.DataProvider.Access.AccessTools.CreateDataConnection(connectionString);
-}
-
-LinqToDB.Data.DataConnection GetAccessConnection(string path, string database)
-{
-	return GetAccessConnection(string.Format(
-		"Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Locale Identifier=1033;Jet OLEDB:Engine Type=5;Persist Security Info=True",
-		System.IO.Path.Combine(path, database)));
-}
-
-void LoadAccessMetadata(string connectionString)
-{
-	using (var dataConnection = GetAccessConnection(connectionString))
-		LoadMetadata(dataConnection);
-}
-
-void LoadAccessMetadata(string path, string database)
-{
-	using(var dataConnection = GetAccessConnection(path, database))
-		LoadMetadata(dataConnection);
-}
-#>
diff --git a/src/Version/LinqToDB.Templates/LinqToDB.DB2.Tools.ttinclude b/src/Version/LinqToDB.Templates/LinqToDB.DB2.Tools.ttinclude
deleted file mode 100644
index c9aba99f74df410d0f2677bffa35d976f6d0c045..0000000000000000000000000000000000000000
--- a/src/Version/LinqToDB.Templates/LinqToDB.DB2.Tools.ttinclude
+++ /dev/null
@@ -1,2 +0,0 @@
-<#@ include file="LinqToDB.Tools.ttinclude" #>
-<#@ include file="LinqToDB.DB2.ttinclude" #>
diff --git a/src/Version/LinqToDB.Templates/LinqToDB.DB2.ttinclude b/src/Version/LinqToDB.Templates/LinqToDB.DB2.ttinclude
deleted file mode 100644
index 12a174244be63278b41ce4f1e58fa8a4c0df8220..0000000000000000000000000000000000000000
--- a/src/Version/LinqToDB.Templates/LinqToDB.DB2.ttinclude
+++ /dev/null
@@ -1,24 +0,0 @@
-<#@ include file="LinqToDB.ttinclude" #>
-<#+
-LinqToDB.Data.DataConnection GetDB2Connection(string connectionString, LinqToDB.DataProvider.DB2.DB2Version version = LinqToDB.DataProvider.DB2.DB2Version.LUW)
-{
-	return LinqToDB.DataProvider.DB2.DB2Tools.CreateDataConnection(connectionString, version);
-}
-
-LinqToDB.Data.DataConnection GetDB2Connection(string server, string port, string database, string uid, string password)
-{
-	return GetDB2Connection(string.Format("Server={0}:{1};Database={2};UID={3};PWD={4};", server, port, database, uid, password));
-}
-
-void LoadDB2Metadata(string connectionString)
-{
-	using (var dataConnection = GetDB2Connection(connectionString))
-		LoadMetadata(dataConnection);
-}
-
-void LoadDB2Metadata(string server, string port, string database, string uid, string password)
-{
-	using (var dataConnection = GetDB2Connection(server, port, database, uid, password))
-		LoadMetadata(dataConnection);
-}
-#>
diff --git a/src/Version/LinqToDB.Templates/LinqToDB.Firebird.Tools.ttinclude b/src/Version/LinqToDB.Templates/LinqToDB.Firebird.Tools.ttinclude
deleted file mode 100644
index 8c5568ddef69c280d079bd03b0a4a0643d0f0947..0000000000000000000000000000000000000000
--- a/src/Version/LinqToDB.Templates/LinqToDB.Firebird.Tools.ttinclude
+++ /dev/null
@@ -1,3 +0,0 @@
-<#@ assembly name="$(LinqToDBT4FirebirdToolsDirectory)FirebirdSql.Data.FirebirdClient.dll" #>
-<#@ include file="LinqToDB.Tools.ttinclude" #>
-<#@ include file="LinqToDB.Firebird.ttinclude" #>
diff --git a/src/Version/LinqToDB.Templates/LinqToDB.Firebird.ttinclude b/src/Version/LinqToDB.Templates/LinqToDB.Firebird.ttinclude
deleted file mode 100644
index 533dbdf01c0bf77e4373bffceea3e978322630ff..0000000000000000000000000000000000000000
--- a/src/Version/LinqToDB.Templates/LinqToDB.Firebird.ttinclude
+++ /dev/null
@@ -1,71 +0,0 @@
-<#@ include file="LinqToDB.ttinclude" #>
-<#
-	LinqToDB.DataProvider.Firebird.FirebirdTools.ResolveFirebird(
-		typeof(FirebirdSql.Data.FirebirdClient.FbConnection).Assembly);
-
-	{
-		var afterLoadMetadata = AfterLoadMetadata;
-		AfterLoadMetadata = () =>
-		{
-			afterLoadMetadata();
-			CheckNameCasing();
-		};
-	}
-#>
-<#+
-void CheckNameCasing()
-{
-	foreach (var t in Tables.Values)
-	{
-		var name = t.TableName;
-
-		if (!name.StartsWith("\""))
-			if (name.StartsWith("_") || name.Any(c => char.IsLower(c) || char.IsWhiteSpace(c)))
-				t.TableName = "\"" + name + "\"";
-
-		foreach (var col in t.Columns.Values)
-		{
-			name = col.ColumnName;
-
-			if (!name.StartsWith("\""))
-				if (name.StartsWith("_") || name.Any(c => char.IsLower(c) || char.IsWhiteSpace(c)))
-					col.ColumnName = "\"" + name + "\"";
-		}
-	}
-}
-
-LinqToDB.Data.DataConnection GetFirebirdConnection(string connectionString)
-{
-	return LinqToDB.DataProvider.Firebird.FirebirdTools.CreateDataConnection(connectionString);
-}
-
-LinqToDB.Data.DataConnection GetFirebirdConnection(string server, string database)
-{
-	return GetFirebirdConnection(server, database, "SYSDBA", "masterkey");
-}
-
-LinqToDB.Data.DataConnection GetFirebirdConnection(string server, string database, string uid, string password)
-{
-	return GetFirebirdConnection(string.Format(
-		"DataSource={0};Database={1};User Id={2};Password={3}",
-		server, database, uid, password));
-}
-
-void LoadFirebirdMetadata(string connectionString)
-{
-	using (var dataConnection = GetFirebirdConnection(connectionString))
-		LoadMetadata(dataConnection);
-}
-
-void LoadFirebirdMetadata(string server, string database, string uid, string password)
-{
-	using (var dataConnection = GetFirebirdConnection(server, database, uid, password))
-		LoadMetadata(dataConnection);
-}
-
-void LoadFirebirdMetadata(string server, string database)
-{
-	using (var dataConnection = GetFirebirdConnection(server, database))
-		LoadMetadata(dataConnection);
-}
-#>
diff --git a/src/Version/LinqToDB.Templates/LinqToDB.Informix.Tools.ttinclude b/src/Version/LinqToDB.Templates/LinqToDB.Informix.Tools.ttinclude
deleted file mode 100644
index ffe6b4aaecbd4307757ded267dc29884ea397da6..0000000000000000000000000000000000000000
--- a/src/Version/LinqToDB.Templates/LinqToDB.Informix.Tools.ttinclude
+++ /dev/null
@@ -1,2 +0,0 @@
-<#@ include file="LinqToDB.Tools.ttinclude" #>
-<#@ include file="LinqToDB.Informix.ttinclude" #>
diff --git a/src/Version/LinqToDB.Templates/LinqToDB.Informix.ttinclude b/src/Version/LinqToDB.Templates/LinqToDB.Informix.ttinclude
deleted file mode 100644
index ce007c248db35929125d254f5e511bd3698664a5..0000000000000000000000000000000000000000
--- a/src/Version/LinqToDB.Templates/LinqToDB.Informix.ttinclude
+++ /dev/null
@@ -1,24 +0,0 @@
-<#@ include file="LinqToDB.ttinclude" #>
-<#+
-LinqToDB.Data.DataConnection GetInformixConnection(string connectionString)
-{
-	return new LinqToDB.Data.DataConnection(new LinqToDB.DataProvider.Informix.InformixDataProvider(), connectionString);
-}
-
-LinqToDB.Data.DataConnection GetInformixConnection(string host, string port, string server, string database, string uid, string password)
-{
-	return GetInformixConnection(string.Format("Host={0};Service={1};Server={2};Protocol=onsoctcp;Database={3};UID={4};PWD={5}", host, port, server, database, uid, password));
-}
-
-void LoadInformixMetadata(string connectionString)
-{
-	using (var dataConnection = GetInformixConnection(connectionString))
-		LoadMetadata(dataConnection);
-}
-
-void LoadInformixMetadata(string host, string port, string server, string database, string uid, string password)
-{
-	using (var dataConnection = GetInformixConnection(host, port, server, database, uid, password))
-		LoadMetadata(dataConnection);
-}
-#>
diff --git a/src/Version/LinqToDB.Templates/LinqToDB.MySql.Tools.ttinclude b/src/Version/LinqToDB.Templates/LinqToDB.MySql.Tools.ttinclude
deleted file mode 100644
index 023871292b7d43e2e12da1981d227ac7bdb2af7e..0000000000000000000000000000000000000000
--- a/src/Version/LinqToDB.Templates/LinqToDB.MySql.Tools.ttinclude
+++ /dev/null
@@ -1,3 +0,0 @@
-<#@ assembly name="$(LinqToDBT4MySqlToolsDirectory)MySql.Data.dll" #>
-<#@ include file="LinqToDB.Tools.ttinclude" #>
-<#@ include file="LinqToDB.MySql.ttinclude" #>
diff --git a/src/Version/LinqToDB.Templates/LinqToDB.MySql.ttinclude b/src/Version/LinqToDB.Templates/LinqToDB.MySql.ttinclude
deleted file mode 100644
index fd93d3e9c686f3b52e7d2064a25c1aefd6a6dac5..0000000000000000000000000000000000000000
--- a/src/Version/LinqToDB.Templates/LinqToDB.MySql.ttinclude
+++ /dev/null
@@ -1,30 +0,0 @@
-<#@ include file="LinqToDB.ttinclude" #>
-<#
-	LinqToDB.DataProvider.MySql.MySqlTools.ResolveMySql(
-		typeof(MySql.Data.MySqlClient.MySqlConnection).Assembly);
-#>
-<#+
-LinqToDB.Data.DataConnection GetMySqlConnection(string connectionString)
-{
-	return LinqToDB.DataProvider.MySql.MySqlTools.CreateDataConnection(connectionString);
-}
-
-LinqToDB.Data.DataConnection GetMySqlConnection(string server, string database, string uid, string password, int port=3306)
-{
-	return GetMySqlConnection(string.Format(
-		"Server={0};Port={4};Database={1};Uid={2};Pwd={3};charset=utf8;",
-		server, database, uid, password,port));
-}
-
-void LoadMySqlMetadata(string connectionString)
-{
-	using (var dataConnection = GetMySqlConnection(connectionString))
-		LoadMetadata(dataConnection);
-}
-
-void LoadMySqlMetadata(string server, string database, string uid, string password,int port=3306)
-{
-	using (var dataConnection = GetMySqlConnection(server, database, uid, password,port))
-		LoadMetadata(dataConnection);
-}
-#>
diff --git a/src/Version/LinqToDB.Templates/LinqToDB.Oracle.Managed.Tools.ttinclude b/src/Version/LinqToDB.Templates/LinqToDB.Oracle.Managed.Tools.ttinclude
deleted file mode 100644
index 4b4be38b605c7e394bbcea45db70e8d5ee78e2da..0000000000000000000000000000000000000000
--- a/src/Version/LinqToDB.Templates/LinqToDB.Oracle.Managed.Tools.ttinclude
+++ /dev/null
@@ -1,3 +0,0 @@
-<#@ assembly name="$(LinqToDBT4OracleToolsDirectory)Oracle.ManagedDataAccess.dll" #>
-<#@ include file="LinqToDB.Tools.ttinclude" #>
-<#@ include file="LinqToDB.Oracle.ttinclude" #>
diff --git a/src/Version/LinqToDB.Templates/LinqToDB.Oracle.Tools.ttinclude b/src/Version/LinqToDB.Templates/LinqToDB.Oracle.Tools.ttinclude
deleted file mode 100644
index 4b4be38b605c7e394bbcea45db70e8d5ee78e2da..0000000000000000000000000000000000000000
--- a/src/Version/LinqToDB.Templates/LinqToDB.Oracle.Tools.ttinclude
+++ /dev/null
@@ -1,3 +0,0 @@
-<#@ assembly name="$(LinqToDBT4OracleToolsDirectory)Oracle.ManagedDataAccess.dll" #>
-<#@ include file="LinqToDB.Tools.ttinclude" #>
-<#@ include file="LinqToDB.Oracle.ttinclude" #>
diff --git a/src/Version/LinqToDB.Templates/LinqToDB.Oracle.ttinclude b/src/Version/LinqToDB.Templates/LinqToDB.Oracle.ttinclude
deleted file mode 100644
index ff6f6725137777d95a6bbb3c76d8d47672439a35..0000000000000000000000000000000000000000
--- a/src/Version/LinqToDB.Templates/LinqToDB.Oracle.ttinclude
+++ /dev/null
@@ -1,29 +0,0 @@
-<#@ include file="LinqToDB.ttinclude" #>
-<#
-	LinqToDB.DataProvider.Oracle.OracleTools.AssemblyName = "Oracle.ManagedDataAccess";
-	LinqToDB.DataProvider.Oracle.OracleTools.ResolveOracle(
-		typeof(Oracle.ManagedDataAccess.Client.OracleConnection).Assembly);
-#><#+
-LinqToDB.Data.DataConnection GetOracleConnection(string connectionString)
-{
-	//return LinqToDB.DataProvider.Oracle.OracleTools.CreateDataConnection(connectionString);
-	return new LinqToDB.Data.DataConnection(new LinqToDB.DataProvider.Oracle.OracleDataProvider("OracleManaged"), connectionString);
-}
-
-LinqToDB.Data.DataConnection GetOracleConnection(string server, string port, string database, string uid, string password)
-{
-	return GetOracleConnection(string.Format("Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST={0})(PORT={1}))(CONNECT_DATA=(SERVICE_NAME={2})));User Id={3};Password={4};", server, port, database, uid, password));
-}
-
-void LoadOracleMetadata(string connectionString)
-{
-	using (var dataConnection = GetOracleConnection(connectionString))
-		LoadMetadata(dataConnection);
-}
-
-void LoadOracleMetadata(string server, string port, string database, string uid, string password)
-{
-	using (var dataConnection = GetOracleConnection(server, port, database, uid, password))
-		LoadMetadata(dataConnection);
-}
-#>
diff --git a/src/Version/LinqToDB.Templates/LinqToDB.Oracle.x64.Tools.ttinclude b/src/Version/LinqToDB.Templates/LinqToDB.Oracle.x64.Tools.ttinclude
deleted file mode 100644
index 4b4be38b605c7e394bbcea45db70e8d5ee78e2da..0000000000000000000000000000000000000000
--- a/src/Version/LinqToDB.Templates/LinqToDB.Oracle.x64.Tools.ttinclude
+++ /dev/null
@@ -1,3 +0,0 @@
-<#@ assembly name="$(LinqToDBT4OracleToolsDirectory)Oracle.ManagedDataAccess.dll" #>
-<#@ include file="LinqToDB.Tools.ttinclude" #>
-<#@ include file="LinqToDB.Oracle.ttinclude" #>
diff --git a/src/Version/LinqToDB.Templates/LinqToDB.Oracle.x86.Tools.ttinclude b/src/Version/LinqToDB.Templates/LinqToDB.Oracle.x86.Tools.ttinclude
deleted file mode 100644
index 4b4be38b605c7e394bbcea45db70e8d5ee78e2da..0000000000000000000000000000000000000000
--- a/src/Version/LinqToDB.Templates/LinqToDB.Oracle.x86.Tools.ttinclude
+++ /dev/null
@@ -1,3 +0,0 @@
-<#@ assembly name="$(LinqToDBT4OracleToolsDirectory)Oracle.ManagedDataAccess.dll" #>
-<#@ include file="LinqToDB.Tools.ttinclude" #>
-<#@ include file="LinqToDB.Oracle.ttinclude" #>
diff --git a/src/Version/LinqToDB.Templates/LinqToDB.PostgreSQL.Tools.ttinclude b/src/Version/LinqToDB.Templates/LinqToDB.PostgreSQL.Tools.ttinclude
deleted file mode 100644
index d23123133419d046323c415e8806e8e880714ed4..0000000000000000000000000000000000000000
--- a/src/Version/LinqToDB.Templates/LinqToDB.PostgreSQL.Tools.ttinclude
+++ /dev/null
@@ -1,4 +0,0 @@
-<#@ assembly name="$(LinqToDBT4PostgreSQLToolsDirectory)Npgsql.dll" #>
-<#@ assembly name="$(LinqToDBT4PostgreSQLToolsDirectory)System.Threading.Tasks.Extensions.dll" #>
-<#@ include file="LinqToDB.Tools.ttinclude" #>
-<#@ include file="LinqToDB.PostgreSQL.ttinclude" #>
diff --git a/src/Version/LinqToDB.Templates/LinqToDB.PostgreSQL.ttinclude b/src/Version/LinqToDB.Templates/LinqToDB.PostgreSQL.ttinclude
deleted file mode 100644
index 7fae75f29bb430e61978db6845a9be11c3b612b6..0000000000000000000000000000000000000000
--- a/src/Version/LinqToDB.Templates/LinqToDB.PostgreSQL.ttinclude
+++ /dev/null
@@ -1,144 +0,0 @@
-<#@ include file="LinqToDB.ttinclude" #>
-<#
-	LinqToDB.DataProvider.PostgreSQL.PostgreSQLTools.ResolvePostgreSQL(
-		typeof(Npgsql.NpgsqlConnection).Assembly);
-
-	{
-		var beforeGenerateLinqToDBModel = BeforeGenerateLinqToDBModel;
-		BeforeGenerateLinqToDBModel = () =>
-		{
-			beforeGenerateLinqToDBModel();
-			SetCaseSensitiveNames();
-
-			FixTableFunctions();
-			FixRecordResultFunctions();
-			FixVoidFunctions();
-			FixFunctionNames();
-		};
-	}
-#>
-<#+
-bool GenerateCaseSensitiveNames = false; // Defines whether to generate case sensitive or insensitive names
-
-// functions with multiple out parameters implemented by pgsql as functions with input parameters that return record with
-// value for each output parameter so we need to move out parameters to result value class field and map
-// record, returned by npgsql provider as object[], to this class
-// exception: functions with only one out parameter treat it as return parameter
-void FixRecordResultFunctions()
-{
-	var initMappingSchema = new Method(() => "void", "InitMappingSchema") { AccessModifier = AccessModifier.Partial };
-	DataContextObject.Members.Add(initMappingSchema);
-	foreach (var proc in Procedures.Values
-		.Where(p => p.IsFunction && !p.IsAggregateFunction && !p.IsTableFunction && p.ProcParameters.Any(pr => pr.IsOut)))
-	{
-		if (proc.ProcParameters.Count(pr => pr.IsOut) > 1)
-		{
-			var result = new Class(SchemaProviderBase.ToValidName(proc.ProcedureName + "Result"));
-			Model.Types.Add(result);
-
-			proc.ProcParameters.Add(new Parameter()
-			{
-				IsResult      = true,
-				ParameterType = result.Name
-			});
-
-			var mappings = new List<string>();
-			foreach (var outParam in proc.ProcParameters.Where(_ => _.IsOut))
-			{
-				result.Members.Add(new Property(() => outParam.ParameterType, outParam.ParameterName, null, null));
-				mappings.Add($"{outParam.ParameterName} = ({outParam.ParameterType})tuple[{mappings.Count}]");
-
-				if (outParam.IsIn)
-					outParam.IsOut = false;
-			}
-
-			proc.ProcParameters = proc.ProcParameters.Where(_ => !_.IsOut).ToList();
-
-			initMappingSchema.BodyBuilders.Add(() => new [] { $"MappingSchema.SetConvertExpression<object[], {result.Name}>(tuple => new {result.Name}() {{ {string.Join(", ", mappings)} }});" });
-		}
-		else // one parameter
-		{
-			var param = proc.ProcParameters.Single(_ => _.IsOut);
-			proc.ProcParameters.Remove(param);
-			proc.ProcParameters.Add(new Parameter()
-			{
-				IsResult      = true,
-				ParameterType = param.ParameterType
-			});
-		}
-	}
-}
-
-void FixFunctionNames()
-{
-	foreach (var proc in Procedures.Values)
-	{
-		if (proc.ProcedureName.Any(char.IsUpper))
-			proc.ProcedureName = "\"" + proc.ProcedureName + "\"";
-	}
-}
-
-void FixTableFunctions()
-{
-	foreach (var proc in Procedures.Values
-		.Where(p => p.IsTableFunction && p.ProcParameters.Any(pr => pr.IsOut)))
-	{
-		proc.ProcParameters = proc.ProcParameters.Where(pr => !pr.IsOut).ToList();
-	}
-}
-
-void FixVoidFunctions()
-{
-	// generated functions should return object for void-typed functions
-	foreach (var proc in Procedures.Values
-		.Where(p => p.IsFunction/* && !p.IsAggregateFunction*/ && !p.IsTableFunction && !p.ProcParameters.Any(pr => pr.IsResult)))
-	{
-		proc.ProcParameters.Add(new Parameter()
-		{
-			IsResult      = true,
-			ParameterType = "object",
-			SystemType    = typeof(object)
-		});
-	}
-}
-
-void SetCaseSensitiveNames()
-{
-	if (GenerateCaseSensitiveNames)
-	{
-		foreach (var t in Tables.Values)
-		{
-			if (t.TableName.Any(char.IsUpper))
-				t.TableName = "\"" + t.TableName + "\"";
-
-			foreach (var c in t.Columns.Values)
-			{
-				if (c.ColumnName.Any(char.IsUpper))
-					c.ColumnName = "\"" + c.ColumnName + "\"";
-			}
-		}
-	}
-}
-
-LinqToDB.Data.DataConnection GetPostgreSQLConnection(string connectionString)
-{
-	return LinqToDB.DataProvider.PostgreSQL.PostgreSQLTools.CreateDataConnection(connectionString);
-}
-
-LinqToDB.Data.DataConnection GetPostgreSQLConnection(string server, string port, string database, string uid, string password)
-{
-	return GetPostgreSQLConnection(string.Format(@"Server={0};Port={1};Database={2};User Id={3};Password={4};Pooling=true;MinPoolSize=10;MaxPoolSize=100;", server, port, database, uid, password));
-}
-
-void LoadPostgreSQLMetadata(string connectionString)
-{
-	using (var dataConnection = GetPostgreSQLConnection(connectionString))
-		LoadMetadata(dataConnection);
-}
-
-void LoadPostgreSQLMetadata(string server, string port, string database, string uid, string password)
-{
-	using (var dataConnection = GetPostgreSQLConnection(server, port, database, uid, password))
-		LoadMetadata(dataConnection);
-}
-#>
diff --git a/src/Version/LinqToDB.Templates/LinqToDB.SQLite.Tools.ttinclude b/src/Version/LinqToDB.Templates/LinqToDB.SQLite.Tools.ttinclude
deleted file mode 100644
index 71eb281790ae04b858c71883c55bbd90241a2d3b..0000000000000000000000000000000000000000
--- a/src/Version/LinqToDB.Templates/LinqToDB.SQLite.Tools.ttinclude
+++ /dev/null
@@ -1,3 +0,0 @@
-<#@ assembly name="$(LinqToDBT4SQLiteToolsDirectory)System.Data.SQLite.dll" #>
-<#@ include file="LinqToDB.Tools.ttinclude" #>
-<#@ include file="LinqToDB.SQLite.ttinclude" #>
diff --git a/src/Version/LinqToDB.Templates/LinqToDB.SQLite.ttinclude b/src/Version/LinqToDB.Templates/LinqToDB.SQLite.ttinclude
deleted file mode 100644
index 1b7e65c09fbd04492d059f4e1081da50fb5ce787..0000000000000000000000000000000000000000
--- a/src/Version/LinqToDB.Templates/LinqToDB.SQLite.ttinclude
+++ /dev/null
@@ -1,44 +0,0 @@
-<#@ include file="LinqToDB.ttinclude" #>
-<#
-	LinqToDB.DataProvider.SQLite.SQLiteTools.ResolveSQLite(typeof(System.Data.SQLite.SQLiteConnection).Assembly);
-
-	{
-		var beforeGenerateLinqToDBModel = BeforeGenerateLinqToDBModel;
-		BeforeGenerateLinqToDBModel = () =>
-		{
-			ConvertSQLiteMetadata();
-			beforeGenerateLinqToDBModel();
-		};
-	}
-#>
-<#+
-void ConvertSQLiteMetadata()
-{
-	foreach (var t in Tables.Values)
-		foreach (var fk in t.ForeignKeys.Values)
-			if (fk.MemberName.Length == 0 || char.IsDigit(fk.MemberName[0]))
-				fk.MemberName = "FK_" + fk.MemberName;
-}
-
-LinqToDB.Data.DataConnection GetSQLiteConnection(string connectionString)
-{
-	return LinqToDB.DataProvider.SQLite.SQLiteTools.CreateDataConnection(connectionString);
-}
-
-LinqToDB.Data.DataConnection GetSQLiteConnection(string path, string database)
-{
-	return GetSQLiteConnection(string.Format("Data Source={0}", System.IO.Path.Combine(path, database)));
-}
-
-void LoadSQLiteMetadata(string connectionString)
-{
-	using (var dataConnection = GetSQLiteConnection(connectionString))
-		LoadMetadata(dataConnection);
-}
-
-void LoadSQLiteMetadata(string path, string database)
-{
-	using (var dataConnection = GetSQLiteConnection(path, database))
-		LoadMetadata(dataConnection);
-}
-#>
diff --git a/src/Version/LinqToDB.Templates/LinqToDB.SapHana.Tools.ttinclude b/src/Version/LinqToDB.Templates/LinqToDB.SapHana.Tools.ttinclude
deleted file mode 100644
index 9d7fb847f993fc7058c09a1b629d089de1f309f8..0000000000000000000000000000000000000000
--- a/src/Version/LinqToDB.Templates/LinqToDB.SapHana.Tools.ttinclude
+++ /dev/null
@@ -1,2 +0,0 @@
-<#@ include file="LinqToDB.Tools.ttinclude" #>
-<#@ include file="LinqToDB.SapHana.ttinclude" #>
diff --git a/src/Version/LinqToDB.Templates/LinqToDB.SapHana.ttinclude b/src/Version/LinqToDB.Templates/LinqToDB.SapHana.ttinclude
deleted file mode 100644
index 28ce34ddfabd8c59e6e5886063e742d75bcaab52..0000000000000000000000000000000000000000
--- a/src/Version/LinqToDB.Templates/LinqToDB.SapHana.ttinclude
+++ /dev/null
@@ -1,106 +0,0 @@
-<#@ include file="LinqToDB.ttinclude" #>
-<#@ import namespace="LinqToDB.DataProvider.SapHana"   #>
-<#
-	Model.Usings.Add("LinqToDB.DataProvider.SapHana");
-	Model.Usings.Add("System.Reflection");
-
-	GenerateProviderSpecificTable = t =>
-	{
-		var method = new Method(
-			() => string.Format("ITable<{0}>", t.TypeName),
-			t.DataContextPropertyName,
-			t.Parameters.Select(p => (Func<string>)(() => p.ParameterType + " " + p.ParameterName)),
-			() => new []
-			{
-				String.Concat("return GetTable<",t.TypeName,">(this, (MethodInfo) MethodBase.GetCurrentMethod(),"),
-				String.Join(",", t.Parameters.Select(p => p.ParameterName)),
-				");"
-			});
-
-		method.Attributes.Add(new Attribute("CalculationViewInputParametersExpression", new string[] {}));
-		return method;
-	};
-
-	LoadProviderSpecificTable = t =>
-	{
-		var v = t as ViewWithParametersTableSchema;
-		return new Table
-			{
-				Schema                  = (t.IsDefaultSchema && !IncludeDefaultSchema) || string.IsNullOrEmpty(t.SchemaName)? null : t.SchemaName,
-				BaseClass               = BaseEntityClass,
-				TableName               = t.TableName,
-				TypeName                =
-				PluralizeClassNames   ? ToPlural  (t.TypeName) :
-				SingularizeClassNames ? ToSingular(t.TypeName) : t.TypeName,
-				DataContextPropertyName =
-				PluralizeDataContextPropertyNames   ? ToPlural  (t.TypeName) :
-				SingularizeDataContextPropertyNames ? ToSingular(t.TypeName) : t.TypeName,
-				IsView                  = t.IsView,
-				IsProviderSpecific      = true,
-				Description             = t.Description,
-				Columns                 = t.Columns.ToDictionary(
-				c => c.ColumnName,
-				c => new Column
-				{
-					ColumnName      = c.ColumnName,
-					ColumnType      = c.ColumnType,
-					IsNullable      = c.IsNullable,
-					IsIdentity      = c.IsIdentity,
-					IsPrimaryKey    = c.IsPrimaryKey,
-					PrimaryKeyOrder = c.PrimaryKeyOrder,
-					MemberName      = CheckType(c.SystemType, c.MemberName),
-					TypeBuilder     = () => c.MemberType,
-					SkipOnInsert    = c.SkipOnInsert,
-					SkipOnUpdate    = c.SkipOnUpdate,
-					Description     = c.Description,
-				}),
-				Parameters = v.Parameters.Select(pr => new Parameter
-				{
-					SchemaName    = pr.SchemaName,
-					SchemaType    = pr.SchemaType,
-					IsIn          = pr.IsIn,
-					IsOut         = pr.IsOut,
-					IsResult      = pr.IsResult,
-					Size          = pr.Size,
-					ParameterName = pr.ParameterName,
-					ParameterType = pr.ParameterType,
-					SystemType    = pr.SystemType,
-					DataType      = pr.DataType.ToString(),
-				})
-				.ToList()
-			};
-	};
-#>
-<#+
-	public partial class Table
-	{
-		public List<Parameter> Parameters;
-	}
-
-	LinqToDB.Data.DataConnection GetSapHanaConnection(string connectionString)
-	{
-		return LinqToDB.DataProvider.SapHana.SapHanaTools.CreateDataConnection(connectionString);
-	}
-
-	LinqToDB.Data.DataConnection GetSapHanaConnection(string server, string schema, string uid, string password)
-	{
-		return GetSapHanaConnection(string.Format("Server={0};Current Schema={1};UserID={2};Password={3};", server, schema, uid, password));
-	}
-
-	void LoadSapHanaMetadata(DataConnection dataConnection)
-	{
-		LoadMetadata(dataConnection);
-	}
-
-	void LoadSapHanaMetadata(string connectionString)
-	{
-		using (var dataConnection = GetSapHanaConnection(connectionString))
-			LoadMetadata(dataConnection);
-	}
-
-	void LoadSapHanaMetadata(string server, string schema, string uid, string password)
-	{
-		using (var dataConnection = GetSapHanaConnection(server, schema, uid, password))
-			LoadMetadata(dataConnection);
-	}
-#>
diff --git a/src/Version/LinqToDB.Templates/LinqToDB.SqlCe.Tools.ttinclude b/src/Version/LinqToDB.Templates/LinqToDB.SqlCe.Tools.ttinclude
deleted file mode 100644
index 208440acd9184e941519a7235267659aeea40c00..0000000000000000000000000000000000000000
--- a/src/Version/LinqToDB.Templates/LinqToDB.SqlCe.Tools.ttinclude
+++ /dev/null
@@ -1,2 +0,0 @@
-<#@ include file="LinqToDB.Tools.ttinclude" #>
-<#@ include file="LinqToDB.SqlCe.ttinclude" #>
diff --git a/src/Version/LinqToDB.Templates/LinqToDB.SqlCe.ttinclude b/src/Version/LinqToDB.Templates/LinqToDB.SqlCe.ttinclude
deleted file mode 100644
index 7f4a3ebe52ec0062b5300de028011fa6f06726ca..0000000000000000000000000000000000000000
--- a/src/Version/LinqToDB.Templates/LinqToDB.SqlCe.ttinclude
+++ /dev/null
@@ -1,24 +0,0 @@
-<#@ include file="LinqToDB.ttinclude" #>
-<#+
-LinqToDB.Data.DataConnection GetSqlCeConnection(string connectionString)
-{
-	return LinqToDB.DataProvider.SqlCe.SqlCeTools.CreateDataConnection(connectionString);
-}
-
-LinqToDB.Data.DataConnection GetSqlCeConnection(string path, string database)
-{
-	return GetSqlCeConnection(string.Format("Data Source={0}", System.IO.Path.Combine(path, database)));
-}
-
-void LoadSqlCeMetadata(string connectionString)
-{
-	using (var dataConnection = GetSqlCeConnection(connectionString))
-		LoadMetadata(dataConnection);
-}
-
-void LoadSqlCeMetadata(string path, string database)
-{
-	using (var dataConnection = GetSqlCeConnection(path, database))
-		LoadMetadata(dataConnection);
-}
-#>
diff --git a/src/Version/LinqToDB.Templates/LinqToDB.SqlServer.SqlTypes.Tools.ttinclude b/src/Version/LinqToDB.Templates/LinqToDB.SqlServer.SqlTypes.Tools.ttinclude
deleted file mode 100644
index 05a8e66ec1169fb6519f94ac9ddb65e45e26cb44..0000000000000000000000000000000000000000
--- a/src/Version/LinqToDB.Templates/LinqToDB.SqlServer.SqlTypes.Tools.ttinclude
+++ /dev/null
@@ -1,3 +0,0 @@
-<#@ assembly name="$(LinqToDBT4SqlServerToolsDirectory)Microsoft.SqlServer.Types.dll" #>
-<#@ include file="LinqToDB.Tools.ttinclude" #>
-<#@ include file="LinqToDB.SqlServer.SqlTypes.ttinclude" #>
diff --git a/src/Version/LinqToDB.Templates/LinqToDB.SqlServer.SqlTypes.ttinclude b/src/Version/LinqToDB.Templates/LinqToDB.SqlServer.SqlTypes.ttinclude
deleted file mode 100644
index cd971c366743fde5382c8f8ffaa09ec91e7d57b8..0000000000000000000000000000000000000000
--- a/src/Version/LinqToDB.Templates/LinqToDB.SqlServer.SqlTypes.ttinclude
+++ /dev/null
@@ -1,5 +0,0 @@
-<#@ include file="LinqToDB.SqlServer.ttinclude" #>
-<#
-	LinqToDB.DataProvider.SqlServer.SqlServerTools.ResolveSqlTypes(
-		typeof(Microsoft.SqlServer.Types.SqlGeography).Assembly);
-#>
diff --git a/src/Version/LinqToDB.Templates/LinqToDB.SqlServer.Tools.ttinclude b/src/Version/LinqToDB.Templates/LinqToDB.SqlServer.Tools.ttinclude
deleted file mode 100644
index fc678e10b2c02405a263e5e11578a0cb1bbb9b62..0000000000000000000000000000000000000000
--- a/src/Version/LinqToDB.Templates/LinqToDB.SqlServer.Tools.ttinclude
+++ /dev/null
@@ -1,2 +0,0 @@
-<#@ include file="LinqToDB.Tools.ttinclude" #>
-<#@ include file="LinqToDB.SqlServer.ttinclude" #>
diff --git a/src/Version/LinqToDB.Templates/LinqToDB.SqlServer.ttinclude b/src/Version/LinqToDB.Templates/LinqToDB.SqlServer.ttinclude
deleted file mode 100644
index 29047c285da6f08bb7cb85973e1f3a364e3c1c15..0000000000000000000000000000000000000000
--- a/src/Version/LinqToDB.Templates/LinqToDB.SqlServer.ttinclude
+++ /dev/null
@@ -1,144 +0,0 @@
-<#@ include file="LinqToDB.ttinclude" #>
-<#
-	{
-		GenerateProcedureDbType = p => p.DataType == "Structured" && p.SchemaType != null;
-
-		var afterGenerateLinqToDBModel = AfterGenerateLinqToDBModel;
-		AfterGenerateLinqToDBModel = () =>
-		{
-			afterGenerateLinqToDBModel();
-			DoGenerateSqlServerFreeText();
-		};
-
-		var buildColumnComparison = BuildColumnComparison;
-		BuildColumnComparison = (c, padding1, padding2, last) =>
-		{
-			if (c.BuildType() == "SqlHierarchyId")
-				return string.Format("\t(bool)(t.{0}{1} == {0}{3}){2}", c.MemberName, padding1, last ? ");" : " &&", last ? "" : padding2);
-			else
-				return buildColumnComparison(c, padding1, padding2, last);
-		};
-	}
-#>
-<#+
-bool GenerateSqlServerFreeText = true; // Defines whether to generate extensions for Free Text search, or not
-
-void DoGenerateSqlServerFreeText()
-{
-	if (!GenerateSqlServerFreeText)
-		return;
-
-	Model.Usings.Add("System.Collections.Generic");
-	Model.Usings.Add("System.Linq.Expressions");
-	Model.Usings.Add("System.Reflection");
-	Model.Usings.Add("LinqToDB");
-	Model.Usings.Add("LinqToDB.DataProvider.SqlServer");
-	Model.Usings.Add("LinqToDB.Extensions");
-
-	DataContextObject.Members.Add(
-		new MemberGroup
-		{
-			Region  = "FreeTextTable",
-			Members =
-			{
-				new Class("FreeTextKey",
-					new MemberGroup
-					{
-						IsCompact = true,
-						Members   =
-						{
-							new Field(() => "T",   "Key"),
-							new Field(() => "int", "Rank")
-						}
-					})
-				{
-					GenericArguments = { "T" },
-					IsPartial        = false
-				},
-
-				new Field(() => "MethodInfo", "_freeTextTableMethod1")
-				{
-					AccessModifier = AccessModifier.Private,
-					IsStatic       = true,
-					InitValue      = "typeof(" + DataContextObject.Name + ").GetMethod(\"FreeTextTable\", new Type[] { typeof(string), typeof(string) })"
-				},
-
-				new Method(() => "ITable<FreeTextKey<TKey>>", "FreeTextTable",
-					new Func<string>[] { () => "string field", () => "string text" },
-					() => new[]
-					{
-						"return this.GetTable<FreeTextKey<TKey>>(",
-						"	this,",
-						"	_freeTextTableMethod1,",
-						"	field,",
-						"	text);",
-					})
-				{
-					GenericArguments = new List<string>() { "TTable", "TKey" },
-					Attributes = { new Attribute("FreeTextTableExpression") }
-				},
-
-				new Field(() => "MethodInfo", "_freeTextTableMethod2")
-				{
-					AccessModifier = AccessModifier.Private,
-					IsStatic       = true,
-					InitValue      =                                                                                                                                                      Environment.NewLine +
-					"	typeof(" + DataContextObject.Name + ").GetMethods()"                                                                                                            + Environment.NewLine +
-					"		.Where(m => m.Name == \"FreeTextTable\" &&  m.IsGenericMethod && m.GetParameters().Length == 2)"                                                            + Environment.NewLine +
-					"		.Where(m => m.GetParameters()[0].ParameterType.IsGenericTypeEx() && m.GetParameters()[0].ParameterType.GetGenericTypeDefinition() == typeof(Expression<>))" + Environment.NewLine +
-					"		.Where(m => m.GetParameters()[1].ParameterType == typeof(string))"                                                                                          + Environment.NewLine +
-					"		.Single()"
-				},
-
-				new Method(() => "ITable<FreeTextKey<TKey>>", "FreeTextTable",
-					new Func<string>[] { () => "Expression<Func<TTable,string>> fieldSelector", () => "string text" },
-					() => new[]
-					{
-						"return this.GetTable<FreeTextKey<TKey>>(",
-						"	this,",
-						"	_freeTextTableMethod2,",
-						"	fieldSelector,",
-						"	text);",
-					})
-				{
-					GenericArguments = { "TTable", "TKey" },
-					Attributes       = { new Attribute("FreeTextTableExpression") }
-				},
-			}
-		}
-	);
-}
-
-LinqToDB.Data.DataConnection GetSqlServerConnection(string connectionString)
-{
-	return LinqToDB.DataProvider.SqlServer.SqlServerTools.CreateDataConnection(connectionString);
-}
-
-LinqToDB.Data.DataConnection GetSqlServerConnection(string server, string database)
-{
-	return GetSqlServerConnection(string.Format("Data Source={0};Database={1};Integrated Security=SSPI", server, database));
-}
-
-LinqToDB.Data.DataConnection GetSqlServerConnection(string server, string database, string user, string password)
-{
-	return GetSqlServerConnection(string.Format("Server={0};Database={1};User Id={2};Password={3};", server, database, user, password));
-}
-
-void LoadSqlServerMetadata(string connectionString)
-{
-	using (var dataConnection = GetSqlServerConnection(connectionString))
-		LoadMetadata(dataConnection);
-}
-
-void LoadSqlServerMetadata(string server, string database)
-{
-	using (var dataConnection = GetSqlServerConnection(server, database))
-		LoadMetadata(dataConnection);
-}
-
-void LoadSqlServerMetadata(string server, string database, string user, string password)
-{
-	using (var dataConnection = GetSqlServerConnection(server, database, user, password))
-		LoadMetadata(dataConnection);
-}
-#>
diff --git a/src/Version/LinqToDB.Templates/LinqToDB.Sybase.Tools.ttinclude b/src/Version/LinqToDB.Templates/LinqToDB.Sybase.Tools.ttinclude
deleted file mode 100644
index bced686ff81440076443ed6565daca09a06c2927..0000000000000000000000000000000000000000
--- a/src/Version/LinqToDB.Templates/LinqToDB.Sybase.Tools.ttinclude
+++ /dev/null
@@ -1,2 +0,0 @@
-<#@ include file="LinqToDB.Tools.ttinclude" #>
-<#@ include file="LinqToDB.Sybase.ttinclude" #>
diff --git a/src/Version/LinqToDB.Templates/LinqToDB.Sybase.ttinclude b/src/Version/LinqToDB.Templates/LinqToDB.Sybase.ttinclude
deleted file mode 100644
index 52c6e6726e689db5b1b5d930a3b9f9753dcc86b9..0000000000000000000000000000000000000000
--- a/src/Version/LinqToDB.Templates/LinqToDB.Sybase.ttinclude
+++ /dev/null
@@ -1,79 +0,0 @@
-<#@ include file="LinqToDB.ttinclude" #>
-<#
-	{
-		var beforeGenerateLinqToDBModel = BeforeGenerateLinqToDBModel;
-		BeforeGenerateLinqToDBModel = () =>
-		{
-			beforeGenerateLinqToDBModel();
-			GenerateSybaseTypes();
-		};
-	}
-#><#+
-bool GenerateSybaseSystemTables = false; // Defines whether to generate Sybase sysobjects tables or not
-
-void GenerateSybaseTypes()
-{
-	if (GenerateSybaseSystemTables)
-	{
-		Tables.Add("sysobjects", new Table
-		{
-			Name                    = "sysobjects",
-			TableName               = "sysobjects",
-			TypeName                = "SysObject",
-			DataContextPropertyName = "SysObjects",
-			BaseClass               = BaseEntityClass,
-			Columns                 = new Dictionary<string,Column>()
-			{
-				{ "name",      new Column { Name = "name",      ColumnName = "name",      ColumnType = "varchar",  TypeBuilder = () => "string",   DbType = DbType.AnsiString,  /*Length = 255*/             }},
-				{ "id",        new Column { Name = "id",        ColumnName = "id",        ColumnType = "int",      TypeBuilder = () => "int",      DbType = DbType.Int32,                                    }},
-				{ "uid",       new Column { Name = "uid",       ColumnName = "uid",       ColumnType = "int",      TypeBuilder = () => "int",      DbType = DbType.Int32,                                    }},
-				{ "type",      new Column { Name = "type",      ColumnName = "type",      ColumnType = "char",     TypeBuilder = () => "string",   DbType = DbType.AnsiStringFixedLength, /*Length = 2,*/    }},
-				{ "userstat",  new Column { Name = "userstat",  ColumnName = "userstat",  ColumnType = "smallint", TypeBuilder = () => "short",    DbType = DbType.Int16,                                    }},
-				{ "sysstat",   new Column { Name = "sysstat",   ColumnName = "sysstat",   ColumnType = "smallint", TypeBuilder = () => "short",    DbType = DbType.Int16,                                    }},
-				{ "indexdel",  new Column { Name = "indexdel",  ColumnName = "indexdel",  ColumnType = "smallint", TypeBuilder = () => "short",    DbType = DbType.Int16,                                    }},
-				{ "schemacnt", new Column { Name = "schemacnt", ColumnName = "schemacnt", ColumnType = "smallint", TypeBuilder = () => "short",    DbType = DbType.Int16,                                    }},
-				{ "sysstat2",  new Column { Name = "sysstat2",  ColumnName = "sysstat2",  ColumnType = "int",      TypeBuilder = () => "int",      DbType = DbType.Int32,                                    }},
-				{ "crdate",    new Column { Name = "crdate",    ColumnName = "crdate",    ColumnType = "datetime", TypeBuilder = () => "DateTime", DbType = DbType.DateTime                                  }},
-				{ "expdate",   new Column { Name = "expdate",   ColumnName = "expdate",   ColumnType = "datetime", TypeBuilder = () => "DateTime", DbType = DbType.DateTime                                  }},
-				{ "deltrig",   new Column { Name = "deltrig",   ColumnName = "deltrig",   ColumnType = "int",      TypeBuilder = () => "int",      DbType = DbType.Int32,                                    }},
-				{ "instrig",   new Column { Name = "instrig",   ColumnName = "instrig",   ColumnType = "int",      TypeBuilder = () => "int",      DbType = DbType.Int32,                                    }},
-				{ "updtrig",   new Column { Name = "updtrig",   ColumnName = "updtrig",   ColumnType = "int",      TypeBuilder = () => "int",      DbType = DbType.Int32,                                    }},
-				{ "seltrig",   new Column { Name = "seltrig",   ColumnName = "seltrig",   ColumnType = "int",      TypeBuilder = () => "int",      DbType = DbType.Int32,                                    }},
-				{ "ckfirst",   new Column { Name = "ckfirst",   ColumnName = "ckfirst",   ColumnType = "int",      TypeBuilder = () => "int",      DbType = DbType.Int32,                                    }},
-				{ "cache",     new Column { Name = "cache",     ColumnName = "cache",     ColumnType = "smallint", TypeBuilder = () => "short",    DbType = DbType.Int16                                     }},
-				{ "audflags",  new Column { Name = "audflags",  ColumnName = "audflags",  ColumnType = "int",      TypeBuilder = () => "int",      DbType = DbType.Int32,  IsNullable = true                 }},
-				{ "objspare",  new Column { Name = "objspare",  ColumnName = "objspare",  ColumnType = "int",      TypeBuilder = () => "int",      DbType = DbType.Int32,                                    }},
-				{ "versionts", new Column { Name = "versionts", ColumnName = "versionts", ColumnType = "binary",   TypeBuilder = () => "byte[]",   DbType = DbType.Binary, IsNullable = true, /*Length = 6*/ }},
-				{ "loginame",  new Column { Name = "loginame",  ColumnName = "loginame",  ColumnType = "varchar",  TypeBuilder = () => "string",   DbType = DbType.AnsiString,  /*Length = 30*/              }},
-			}
-		});
-	}
-}
-
-LinqToDB.Data.DataConnection GetSybaseConnection(string connectionString)
-{
-	return LinqToDB.DataProvider.Sybase.SybaseTools.CreateDataConnection(connectionString);
-}
-
-LinqToDB.Data.DataConnection GetSybaseConnection(string server, string database)
-{
-	return GetSybaseConnection(string.Format("Data Source={0};Database={1};Integrated Security=SSPI", server, database));
-}
-
-LinqToDB.Data.DataConnection GetSybaseConnection(string server, string port, string database, string uid, string password)
-{
-	return GetSybaseConnection(string.Format("Data Source={0};Port={1};Database={2};Uid={3};Password={4};Charset=utf8;", server, port, database, uid, password));
-}
-
-void LoadSybaseMetadata(string connectionString)
-{
-	using (var dataConnection = GetSybaseConnection(connectionString))
-		LoadMetadata(dataConnection);
-}
-
-void LoadSybaseMetadata(string server, string port, string database, string uid, string password)
-{
-	using (var dataConnection = GetSybaseConnection(server, port, database, uid, password))
-		LoadMetadata(dataConnection);
-}
-#>
diff --git a/src/Version/LinqToDB.Templates/LinqToDB.Tools.ttinclude b/src/Version/LinqToDB.Templates/LinqToDB.Tools.ttinclude
deleted file mode 100644
index d804bb85f737d248fb336c5a61e116e54d8dea57..0000000000000000000000000000000000000000
--- a/src/Version/LinqToDB.Templates/LinqToDB.Tools.ttinclude
+++ /dev/null
@@ -1 +0,0 @@
-<#@ assembly name="$(LinqToDBT4ToolsDirectory)linq2db.dll" #>
diff --git a/src/Version/LinqToDB.Templates/LinqToDB.ttinclude b/src/Version/LinqToDB.Templates/LinqToDB.ttinclude
deleted file mode 100644
index 0aa897a12f42602a506ee540d14effb295099263..0000000000000000000000000000000000000000
--- a/src/Version/LinqToDB.Templates/LinqToDB.ttinclude
+++ /dev/null
@@ -1,1044 +0,0 @@
-<#@ assembly name="System.Data"        #>
-<#@ import namespace="System.Data"     #>
-<#@ import namespace="LinqToDB.Data"   #>
-<#@ import namespace="System.Text" #>
-<#@ include file="DataModel.ttinclude" #>
-<#
-	if (BaseDataContextClass == null)
-		BaseDataContextClass = "LinqToDB.Data.DataConnection";
-#>
-<#+
-Action BeforeGenerateLinqToDBModel = () => {};
-Action AfterGenerateLinqToDBModel  = () => {};
-
-Func<Table,MemberBase> GenerateProviderSpecificTable = t => null;
-Func<Parameter, bool>  GenerateProcedureDbType       = p => false;
-
-bool   GenerateObsoleteAttributeForAliases = false;
-bool   GenerateFindExtensions              = true;
-bool   IsCompactColumns                    = true;
-bool   IsCompactColumnAliases              = true;
-bool   GenerateDataTypes                   = false;
-bool?  GenerateLengthProperty              = null;
-bool?  GeneratePrecisionProperty           = null;
-bool?  GenerateScaleProperty               = null;
-bool   GenerateDbTypes                     = false;
-bool   GenerateSchemaAsType                = false;
-bool   GenerateViews                       = true;
-bool   GenerateProcedureResultAsList       = false;
-bool   PrefixTableMappingWithSchema        = true;
-string SchemaNameSuffix                    = "Schema";
-string SchemaDataContextTypeName           = "DataContext";
-
-Dictionary<string,string> SchemaNameMapping = new Dictionary<string,string>();
-
-Func<string,string,IEnumerable<Method>> GetConstructors =  (conf, name) => GetConstructorsImpl(conf, name);
-
-Func<Column, string, string, bool, string> BuildColumnComparison = (c, padding1, padding2, last) =>
-{
-	return string.Format("\tt.{0}{1} == {0}{3}{2}", c.MemberName, padding1, last ? ");" : " &&", last ? "" : padding2);
-};
-
-static IEnumerable<Method> GetConstructorsImpl(string defaultConfiguration, string name)
-{
-	if (defaultConfiguration == null)
-		yield return new Method((Func<string>)null, name);
-	else
-		yield return new Method((Func<string>)null, name) { AfterSignature = { ": base(" + ToStringLiteral(defaultConfiguration) + ")" } };
-	yield return new Method((Func<string>)null, name, new Func<string>[] { () => "string configuration" }) { AfterSignature = { ": base(configuration)" } };
-}
-
-void GenerateTypesFromMetadata()
-{
-	BeforeGenerateLinqToDBModel();
-
-	Model.Usings.Add("LinqToDB");
-	Model.Usings.Add("LinqToDB.Mapping");
-
-	if (NamespaceName == null)
-		NamespaceName = "DataModel";
-
-	string schemaName;
-
-	var schemas =
-	(
-		from t in Tables.Values
-		where GenerateSchemaAsType && t.Schema != null && !t.TableSchema.IsDefaultSchema
-		group t by t.Schema into gr
-		orderby gr.Key
-		let typeName = SchemaNameMapping.TryGetValue(gr.Key, out schemaName) ? schemaName : gr.Key
-		select new
-		{
-			Name            = gr.Key,
-			TypeName        = typeName + SchemaNameSuffix,
-			PropertyName    = typeName,
-			Props           = new MemberGroup { IsCompact = true },
-			Aliases         = new MemberGroup { IsCompact = true, Region = "Alias members" },
-			TableExtensions = new MemberGroup { Region = "Table Extensions" },
-			Type            = new Class(typeName + SchemaNameSuffix) { IsStatic = true },
-			Tables          = gr.ToList(),
-			DataContext     = new Class(SchemaDataContextTypeName),
-			Procedures      = new MemberGroup(),
-			Functions       = new MemberGroup(),
-			TableFunctions  = new MemberGroup { Region = "Table Functions" },
-		}
-	).ToDictionary(t => t.Name);
-
-	var procSchemas =
-	(
-		from p in Procedures.Values
-		where GenerateSchemaAsType && p.Schema != null && !p.IsDefaultSchema && !schemas.ContainsKey(p.Schema)
-		group p by p.Schema into gr
-		orderby gr.Key
-		let typeName = SchemaNameMapping.TryGetValue(gr.Key, out schemaName) ? schemaName : gr.Key
-		select new
-		{
-			Name            = gr.Key,
-			TypeName        = typeName + SchemaNameSuffix,
-			PropertyName    = typeName,
-			Props           = new MemberGroup { IsCompact = true },
-			Aliases         = new MemberGroup { IsCompact = true, Region = "Alias members" },
-			TableExtensions = new MemberGroup { Region = "Table Extensions" },
-			Type            = new Class(typeName + SchemaNameSuffix) { IsStatic = true },
-			Tables          = new List<Table>(),
-			DataContext     = new Class(SchemaDataContextTypeName),
-			Procedures      = new MemberGroup(),
-			Functions       = new MemberGroup(),
-			TableFunctions  = new MemberGroup { Region = "Table Functions" },
-		}
-	).ToDictionary(s => s.Name);
-
-	foreach(var schema in procSchemas)
-		schemas.Add(schema.Key, schema.Value);
-
-	var defProps           = new MemberGroup { IsCompact = true };
-	var defAliases         = new MemberGroup { IsCompact = true, Region = "Alias members" };
-	var defTableExtensions = new MemberGroup { };
-
-	if (schemas.Count > 0)
-	{
-		var body = new List<Func<IEnumerable<string>>>();
-
-		var schemaGroup   = new MemberGroup { Region = "Schemas" };
-		var schemaMembers = new MemberGroup { IsCompact = true   };
-
-		var maxLen1 = schemas.Values.Max(schema => schema.PropertyName.Trim().Length);
-		var maxLen2 = schemas.Values.Max(schema => schema.TypeName.    Trim().Length);
-
-		foreach (var schema in schemas.Values)
-		{
-			schemaMembers.Members.Add(new Property(() => schema.TypeName + "." + SchemaDataContextTypeName, schema.PropertyName));
-			body.Add(() => new string[] {
-				schema.PropertyName + LenDiff(maxLen1, schema.PropertyName) +
-				" = new " + schema.TypeName + "." + LenDiff(maxLen2, schema.TypeName) +
-				SchemaDataContextTypeName + "(this);"});
-		}
-
-		schemaGroup.Members.Add(schemaMembers);
-		schemaGroup.Members.Add(new Method(() => "void", "InitSchemas", new Func<string>[0], body.ToArray()));
-
-		DataContextObject.Members.Add(schemaGroup);
-	}
-
-	if (GenerateConstructors)
-	{
-		foreach (var c in GetConstructors(DefaultConfiguration, DataContextObject.Name))
-		{
-			if (c.BodyBuilders.Count > 0)
-				c.BodyBuilders.Add(() => new[] { "" });
-
-			if (schemas.Count > 0)
-				c.BodyBuilders.Add(() => new[] { "InitSchemas();" });
-
-			c.BodyBuilders.Add(() => new [] {"InitDataContext();", "InitMappingSchema();" });
-
-			DataContextObject.Members.Add(c);
-		}
-	}
-
-	DataContextObject.Members.Add(new MemberGroup
-	{
-		IsCompact = true,
-		Members   =
-		{
-			new Method(() => "void", "InitDataContext"  ) { AccessModifier = AccessModifier.Partial },
-			new Method(() => "void", "InitMappingSchema") { AccessModifier = AccessModifier.Partial }
-		}
-	});
-
-	if (Tables.Count > 0)
-		DataContextObject.Members.Insert(0, defProps);
-
-	foreach (var schema in schemas.Values)
-	{
-		schema.Type.Members.Add(schema.DataContext);
-		schema.DataContext.Members.Insert(0, schema.Props);
-
-		schema.DataContext.Members.Add(new Field (() => "IDataContext", "_dataContext") { AccessModifier = AccessModifier.Private, IsReadonly = true });
-		schema.DataContext.Members.Add(new Method(() => null, schema.DataContext.Name, new Func<string>[] { () => "IDataContext dataContext" }, () => new[] { "_dataContext = dataContext;" }));
-
-		foreach (var t in schema.Tables)
-		{
-			t.TypePrefix = schema.TypeName + ".";
-		}
-	}
-
-	var associationExtensions = new MemberGroup() {Region = "Associations"};
-
-	foreach (var t in Tables.Values.OrderBy(tbl => tbl.IsProviderSpecific).ThenBy(tbl => tbl.TypeName))
-	{
-		Action<Class> addType     = tp => Model.Types.Add(tp);
-		var props                 = defProps;
-		var aliases               = defAliases;
-		var tableExtensions       = defTableExtensions;
-
-		if (t.IsView && !GenerateViews) {
-			continue;
-		}
-
-		var schema = t.Schema != null && schemas.ContainsKey(t.Schema) ? schemas[t.Schema] : null;
-
-		if (schema != null)
-		{
-			var si = schemas[t.Schema];
-
-			addType         = tp => si.Type.Members.Add(tp);
-			props           = si.Props;
-			aliases         = si.Aliases;
-			tableExtensions = si.TableExtensions;
-		}
-
-		MemberBase dcProp = t.IsProviderSpecific ?
-			GenerateProviderSpecificTable(t) :
-			new Property(
-				() => string.Format("ITable<{0}>", t.TypeName),
-				t.DataContextPropertyName,
-				() => new[] { string.Format((schema == null ? "this" : "_dataContext") + ".GetTable<{0}>()", t.TypeName) },
-				null);
-
-		if (dcProp == null) continue;
-
-		t.DataContextProperty = dcProp;
-
-		props.Members.Add(dcProp);
-
-		Property aProp = null;
-
-		if (t.AliasPropertyName != null && t.AliasPropertyName != t.DataContextPropertyName)
-		{
-			aProp = new Property(
-				() => string.Format("ITable<{0}>", t.TypeName),
-				t.AliasPropertyName,
-				() => new[] { t.DataContextPropertyName },
-				null);
-
-			if (GenerateObsoleteAttributeForAliases)
-				aProp.Attributes.Add(new Attribute("Obsolete", ToStringLiteral("Use " + t.DataContextPropertyName + " instead.")));
-
-			aliases.Members.Add(aProp);
-		}
-
-		var tableAttrs = new List<string>();
-
-		if (DatabaseName != null) tableAttrs.Add("Database="  + ToStringLiteral(DatabaseName));
-		if (t.Schema     != null) tableAttrs.Add("Schema="    + ToStringLiteral(t.Schema));
-
-		tableAttrs.Add((tableAttrs.Count == 0 ? "" : "Name=") + ToStringLiteral(t.TableName));
-
-		if (t.IsView)
-			tableAttrs.Add("IsView=true");
-
-		t.Attributes.Add(new Attribute("Table", tableAttrs.ToArray()) { IsSeparated = true } );
-
-		var comments = new List<string>();
-
-		if (!string.IsNullOrWhiteSpace(t.Description))
-		{
-			comments.Add("/ <summary>");
-			foreach (var line in t.Description.Split('\n'))
-				comments.Add("/ " + line.TrimEnd());
-			comments.Add("/ </summary>");
-		}
-
-		if (comments.Count > 0)
-		{
-			t.     Comment.AddRange(comments);
-			dcProp.Comment.AddRange(comments);
-
-			if (aProp != null)
-				aProp.Comment.AddRange(comments);
-		}
-
-		var columns        = new MemberGroup { IsCompact = IsCompactColumns };
-		var columnAliases  = new MemberGroup { IsCompact = IsCompactColumnAliases, Region = "Alias members" };
-		var nPKs           = t.Columns.Values.Count(c => c.IsPrimaryKey);
-		var allNullable    = t.Columns.Values.All  (c => c.IsNullable || c.IsIdentity);
-		var nameMaxLen     = t.Columns.Values.Max  (c => (int?)(c.MemberName == c.ColumnName
-			? 0
-			: ToStringLiteral(c.ColumnName).Length)) ?? 0;
-		var dbTypeMaxLen   = t.Columns.Values.Max  (c => (int?)(c.ColumnType.Length)) ?? 0;
-		var dataTypeMaxLen = t.Columns.Values.Where(c => c.DataType != null).Max  (c => (int?)(c.DataType.Length)) ?? 0;
-		var dataTypePrefix = t.Columns.Values.Any  (c => c.MemberName == "DataType") ? "LinqToDB." : "";
-
-		foreach (var c in t.Columns.Values)
-		{
-			// Column.
-			//
-			var ca = new Attribute("Column");
-			var canBeReplaced = true;
-
-			if (c.MemberName != c.ColumnName)
-			{
-				var columnNameInAttr = ToStringLiteral(c.ColumnName);
-
-				var space = new string(' ', nameMaxLen - columnNameInAttr.Length);
-
-				ca.Parameters.Add(columnNameInAttr + space);
-				canBeReplaced = false;
-			}
-			else if (nameMaxLen > 0)
-			{
-				ca.Parameters.Add(new string(' ', nameMaxLen));
-				canBeReplaced = false;
-			}
-
-			if (GenerateDbTypes)
-			{
-				var space = new string(' ', dbTypeMaxLen - c.ColumnType.Length);
-
-				ca.Parameters.Add("DbType=" + ToStringLiteral(c.ColumnType) + space);
-				canBeReplaced = false;
-			}
-
-			if (GenerateDataTypes)
-			{
-				var space = new string(' ', dataTypeMaxLen - c.DataType.Length);
-				ca.Parameters.Add("DataType=" + dataTypePrefix + c.DataType + space);
-				canBeReplaced = false;
-			}
-
-			if (GenerateDataTypes && !GenerateLengthProperty.HasValue || GenerateLengthProperty == true)
-			{
-				if (c.Length    != null) ca.Parameters.Add("Length="    + (c.Length == int.MaxValue ? "int.MaxValue" : c.Length.ToString()));
-				canBeReplaced = false;
-			}
-
-			if (GenerateDataTypes && !GeneratePrecisionProperty.HasValue || GeneratePrecisionProperty == true)
-			{
-				if (c.Precision != null) ca.Parameters.Add("Precision=" + c.Precision);
-				canBeReplaced = false;
-			}
-
-			if (GenerateDataTypes && !GenerateScaleProperty.HasValue || GenerateScaleProperty == true)
-			{
-				if (c.Scale     != null) ca.Parameters.Add("Scale=" + c.Scale);
-				canBeReplaced = false;
-			}
-
-			if (c.SkipOnInsert && !c.IsIdentity)
-			{
-				ca.Parameters.Add("SkipOnInsert=true");
-				canBeReplaced = false;
-			}
-
-			if (c.SkipOnUpdate && !c.IsIdentity)
-			{
-				ca.Parameters.Add("SkipOnUpdate=true");
-				canBeReplaced = false;
-			}
-
-			if (c.IsDiscriminator)
-			{
-				ca.Parameters.Add("IsDiscriminator=true");
-				canBeReplaced = false;
-			}
-
-			c.Attributes.Add(ca);
-
-			// PK.
-			//
-			if (c.IsPrimaryKey)
-			{
-				var pka = new Attribute("PrimaryKey");
-
-				if (nPKs > 1)
-					pka.Parameters.Add(c.PrimaryKeyOrder.ToString());
-
-				if (canBeReplaced)
-					c.Attributes[0] = pka;
-				else
-					c.Attributes.Add(pka);
-
-				canBeReplaced = false;
-			}
-
-			// Identity.
-			//
-			if (c.IsIdentity)
-			{
-				var ida = new Attribute("Identity");
-
-				if (canBeReplaced)
-					c.Attributes[0] = ida;
-				else
-					c.Attributes.Add(ida);
-
-				canBeReplaced = false;
-			}
-
-			// Nullable.
-			//
-			if (c.IsNullable)
-				c.Attributes.Add(new Attribute((allNullable ? "" : "   ") + "Nullable"));
-			else if (!c.IsIdentity)
-				c.Attributes.Add(new Attribute("NotNull"));
-
-			var columnComments = new List<string>();
-
-			if (!string.IsNullOrWhiteSpace(c.Description))
-			{
-				columnComments.Add("/ <summary>");
-				foreach (var line in c.Description.Split('\n'))
-					columnComments.Add("/ " + line.TrimEnd());
-				columnComments.Add("/ </summary>");
-			}
-
-			if (columnComments.Count > 0)
-				c.Comment.AddRange(columnComments);
-
-			// End line comment.
-			//
-			c.EndLineComment = c.ColumnType;
-
-			SetPropertyValue(c, "IsNotifying", true);
-			SetPropertyValue(c, "IsEditable",  true);
-
-			columns.Members.Add(c);
-
-			// Alias.
-			//
-			if (c.AliasName != null && c.AliasName != c.MemberName)
-			{
-				var caProp = new Property(
-					c.TypeBuilder,
-					c.AliasName,
-					() => new[] { c.MemberName },
-					() => new[] { c.MemberName + " = value;"});
-
-				caProp.Comment.AddRange(columnComments);
-
-				if (GenerateObsoleteAttributeForAliases)
-					caProp.Attributes.Add(new Attribute("Obsolete", ToStringLiteral("Use " + c.MemberName + " instead.")));
-
-				caProp.Attributes.Add(new Attribute("ColumnAlias" , ToStringLiteral(c.MemberName)));
-
-				columnAliases.Members.Add(caProp);
-			}
-		}
-
-		t.Members.Add(columns);
-
-		if (columnAliases.Members.Count > 0)
-			t.Members.Add(columnAliases);
-
-		if (GenerateAssociations || GenerateAssociationExtensions)
-		{
-			var keys = t.ForeignKeys.Values.ToList();
-
-			if (!GenerateBackReferences)
-				keys = keys.Where(k => k.BackReference != null).ToList();
-
-			if (keys.Count > 0)
-			{
-				var associations          = new MemberGroup { Region = "Associations" };
-				var extensionAssociations = new MemberGroup { Region = t.Name + " Associations"};
-
-				foreach (var key in keys.OrderBy(k => k.MemberName))
-				{
-					key.Comment.Add("/ <summary>");
-					key.Comment.Add("/ " + key.KeyName);
-					key.Comment.Add("/ </summary>");
-
-					if (key.AssociationType == AssociationType.OneToMany)
-						key.TypeBuilder = () => string.Format(OneToManyAssociationType, key.OtherTable.TypePrefix + key.OtherTable.TypeName);
-					else
-						key.TypeBuilder = () => key.OtherTable.TypePrefix + key.OtherTable.TypeName;
-
-					var aa = new Attribute("Association");
-
-					aa.Parameters.Add("ThisKey="   + ToStringLiteral(string.Join(", ", (from c in key.ThisColumns  select c.MemberName).ToArray())));
-					aa.Parameters.Add("OtherKey="  + ToStringLiteral(string.Join(", ", (from c in key.OtherColumns select c.MemberName).ToArray())));
-					aa.Parameters.Add("CanBeNull=" + (key.CanBeNull ? "true" : "false"));
-
-					switch (key.AssociationType)
-					{
-						case AssociationType.OneToOne  : aa.Parameters.Add("Relationship=Relationship.OneToOne");  break;
-						case AssociationType.OneToMany : aa.Parameters.Add("Relationship=Relationship.OneToMany"); break;
-						case AssociationType.ManyToOne : aa.Parameters.Add("Relationship=Relationship.ManyToOne"); break;
-					}
-
-					if (key.BackReference != null)
-					{
-						if (!string.IsNullOrEmpty(key.KeyName))
-							aa.Parameters.Add("KeyName=" + ToStringLiteral(key.KeyName));
-						if (GenerateBackReferences && !string.IsNullOrEmpty(key.BackReference.MemberName))
-							aa.Parameters.Add("BackReferenceName=" + ToStringLiteral(key.BackReference.MemberName));
-					}
-					else
-					{
-						aa.Parameters.Add("IsBackReference=true");
-					}
-
-					key.Attributes.Add(aa);
-
-					SetPropertyValue(key, "IsNotifying", true);
-					SetPropertyValue(key, "IsEditable",  true);
-
-					associations.Members.Add(key);
-
-					var extension = new Method(() => string.Format("IQueryable<{0}>", key.OtherTable.TypePrefix + key.OtherTable.TypeName), GetAssociationExtensionPluralName(key));
-					extension.Name = GetAssociationExtensionPluralName(key);
-
-					extension.ParameterBuilders.Add(() => string.Format("this {0}{1} obj", t.TypePrefix, t.TypeName));
-
-					extension.ParameterBuilders.Add(() => "IDataContext db");
-					extension.Attributes.Add(aa);
-					extension.IsStatic = true;
-
-					extension.Comment.Add("/ <summary>");
-					extension.Comment.Add("/ " + key.KeyName);
-					extension.Comment.Add("/ </summary>");
-
-					Func<string> builder = () =>
-					{
-						var sb = new StringBuilder();
-						sb
-							.Append("return db.GetTable<")
-							.Append(key.OtherTable.TypePrefix + key.OtherTable.TypeName)
-							.Append(">().Where(c => ");
-						for (var i = 0; i < key.OtherColumns.Count; i++)
-						{
-							sb.Append("c.")
-								.Append(key.OtherColumns[i].MemberName)
-								.Append(" == obj.")
-								.Append(key.ThisColumns[i].MemberName)
-								.Append(" && ");
-						}
-						sb.Length -= 4;
-						sb.Append(");");
-
-						return sb.ToString();
-					};
-
-					extension.BodyBuilders.Add(() => new[] { builder() });
-
-					extensionAssociations.Members.Add(extension);
-
-					if (key.AssociationType != AssociationType.OneToMany)
-					{
-						var single = new Method(() => t.TypePrefix + t.TypeName, GetAssociationExtensionSinglularName(key));
-						
-						single.ParameterBuilders.Add(() => string.Format("this {0}{1} obj", key.OtherTable.TypePrefix, key.OtherTable.TypeName));
-
-						single.ParameterBuilders.Add(() => "IDataContext db");
-						single.Attributes.Add(aa);
-						single.IsStatic = true;
-
-						single.Comment.Add("/ <summary>");
-						single.Comment.Add("/ " + key.KeyName);
-						single.Comment.Add("/ </summary>");
-
-						Func<string> builderSingle = () =>
-						{
-							var sb = new StringBuilder();
-							sb
-								.Append("return db.GetTable<")
-								.Append(t.TypePrefix + t.TypeName)
-								.Append(">().Where(c => ");
-							for (var i = 0; i < key.OtherColumns.Count; i++)
-							{
-								sb.Append("c.")
-									.Append(key.ThisColumns[i].MemberName)
-									.Append(" == obj.")
-									.Append(key.OtherColumns[i].MemberName)
-									.Append(" && ");
-							}
-							sb.Length -= 4;
-							sb.Append(");");
-
-							return sb.ToString();
-						};
-
-						single.BodyBuilders.Add(() =>
-						{
-							var sb = new StringBuilder(builderSingle());
-							sb.Length -= 1;
-
-							if (key.CanBeNull)
-								sb.Append(".FirstOrDefault();");
-							else
-								sb.Append(".First();");
-
-							return new [] { sb.ToString() };
-						});
-
-						extensionAssociations.Members.Add(single);
-					}
-				}
-
-				if (GenerateAssociations)
-					t.Members.Add(associations);
-				if (GenerateAssociationExtensions)
-					associationExtensions.Members.Add(extensionAssociations);
-			}
-		}
-
-		if (GenerateFindExtensions && nPKs > 0)
-		{
-			var PKs         = t.Columns.Values.Where(c => c.IsPrimaryKey).ToList();
-			var maxNameLen1 = PKs.Max(c => (int?)c.MemberName.Length) ?? 0;
-			var maxNameLen2 = PKs.Take(nPKs - 1).Max(c => (int?)c.MemberName.Length) ?? 0;
-
-			tableExtensions.Members.Add(
-				new Method(
-					() => t.TypeName,
-					"Find",
-					new Func<string>[] { () => (string.Format("this ITable<{0}> table", t.TypeName)) }
-						.Union(PKs.Select(c => (Func<string>)(() => c.BuildType() + " " + c.MemberName))),
-					() => new[] { "return table.FirstOrDefault(t =>" }
-						.Union(PKs.SelectMany((c,i) =>
-						{
-							var ss = new List<string>();
-
-							if (c.Conditional != null)
-								ss.Add("#if " + c.Conditional);
-
-							ss.Add(BuildColumnComparison(c, LenDiff(maxNameLen1, c.MemberName), LenDiff(maxNameLen2, c.MemberName), i == nPKs - 1));
-
-							if (c.Conditional != null)
-							{
-								if (ss[1].EndsWith(");"))
-								{
-									ss[1] = ss[1].Substring(0, ss[1].Length - 2);
-									ss.Add("#endif");
-									ss.Add("\t\t);");
-								}
-								else
-								{
-									ss.Add("#endif");
-								}
-							}
-
-							return ss;
-						})))
-				{
-					IsStatic = true
-				});
-		}
-
-		addType(t);
-
-		if (!string.IsNullOrWhiteSpace(t.AliasTypeName))
-		{
-			var aClass = new Class(t.AliasTypeName)
-			{
-				BaseClass = t.TypeName
-			};
-
-			if (comments.Count > 0)
-				aClass.Comment.AddRange(comments);
-
-			if (GenerateObsoleteAttributeForAliases)
-				aClass.Attributes.Add(new Attribute("Obsolete", ToStringLiteral("Use " + t.TypeName + " instead.")));
-
-			Model.Types.Add(aClass);
-		}
-	}
-
-	if (associationExtensions.Members.Count > 0)
-		defTableExtensions.Members.Add(associationExtensions);
-
-	if (defAliases.Members.Count > 0)
-		DataContextObject.Members.Add(defAliases);
-
-	foreach (var schema in schemas.Values)
-		if (schema.Aliases.Members.Count > 0)
-			schema.Type.Members.Add(defAliases);
-
-	if (Procedures.Count > 0)
-	{
-		Model.Usings.Add("System.Collections.Generic");
-		Model.Usings.Add("System.Data");
-		Model.Usings.Add("LinqToDB.Data");
-		Model.Usings.Add("LinqToDB.Common");
-
-		if (Procedures.Values.Any(p => p.IsTableFunction))
-			Model.Usings.Add("System.Reflection");
-
-		if (Procedures.Values.Any(p => p.IsAggregateFunction))
-			Model.Usings.Add("System.Linq.Expressions");
-
-		var procs = new MemberGroup();
-		var funcs = new MemberGroup();
-		var tabfs = new MemberGroup { Region = "Table Functions" };
-
-		foreach (var p in Procedures.Values.Where(
-			proc => proc.IsLoaded || proc.IsFunction && !proc.IsTableFunction ||
-			proc.IsTableFunction && proc.ResultException != null
-			))
-		{
-			Action<MemberGroup> addProcs = tp => procs.Members.Add(tp);
-			Action<MemberGroup> addFuncs = tp => funcs.Members.Add(tp);
-			Action<MemberGroup> addTabfs = tp => tabfs.Members.Add(tp);
-
-			var thisDataContext = "this";
-
-			var schema = p.Schema != null && schemas.ContainsKey(p.Schema) ? schemas[p.Schema] : null;
-
-			if (schema != null)
-			{
-				var si = schemas[p.Schema];
-
-				addProcs        = tp => si.Procedures.    Members.Add(tp);
-				addFuncs        = tp => si.Functions.     Members.Add(tp);
-				addTabfs        = tp => si.TableFunctions.Members.Add(tp);
-				thisDataContext = "_dataContext";
-			}
-
-			var proc = new MemberGroup { Region = p.Name };
-
-			if (!p.IsFunction)          addProcs(proc);
-			else if (p.IsTableFunction) addTabfs(proc);
-			else                        addFuncs(proc);
-
-			if (p.ResultException != null)
-			{
-				proc.Errors.Add(p.ResultException.Message);
-				continue;
-			}
-
-			proc.Members.Add(p);
-
-			if (p.IsTableFunction)
-			{
-				var tableAttrs = new List<string>();
-
-				if (DatabaseName != null) tableAttrs.Add("Database=" + ToStringLiteral(DatabaseName));
-				if (p.Schema     != null) tableAttrs.Add("Schema="   + ToStringLiteral(p.Schema));
-
-				tableAttrs.Add("Name=" + ToStringLiteral(p.ProcedureName));
-
-				p.Attributes.Add(new Attribute("Sql.TableFunction", tableAttrs.ToArray()));
-
-				p.TypeBuilder = () => "ITable<" + p.ResultTable.TypeName + ">";
-			}
-			else if (p.IsAggregateFunction)
-			{
-				p.IsStatic = true;
-				p.TypeBuilder = () => p.ProcParameters.Single(pr => pr.IsResult).ParameterType;
-				var paramCount = p.ProcParameters.Count(pr => !pr.IsResult);
-				p.Attributes.Add(new Attribute("Sql.Function", "Name=" + ToStringLiteral((p.Schema != null ? p.Schema + "." : null) + p.ProcedureName), "ServerSideOnly=true, IsAggregate = true" + (paramCount > 0 ? (", ArgIndices = new[] { " + string.Join(", ", Enumerable.Range(0, p.ProcParameters.Count(pr => !pr.IsResult))) + " }") : null)));
-
-				if (p.IsDefaultSchema || !GenerateSchemaAsType)
-					p.ParameterBuilders.Add(() => "this IEnumerable<TSource> src");
-				else // otherwise function will be generated in nested class, which doesn't support extension methods
-					p.ParameterBuilders.Add(() => "IEnumerable<TSource> src");
-
-				foreach (var inp in p.ProcParameters.Where(pr => !pr.IsResult))
-					p.ParameterBuilders.Add(() => $"Expression<Func<TSource, {inp.ParameterType}>> " + inp.ParameterName);
-
-				p.Name += "<TSource>";
-			}
-			else if (p.IsFunction)
-			{
-				p.IsStatic    = true;
-				p.TypeBuilder = () => p.ProcParameters.Single(pr => pr.IsResult).ParameterType;
-				p.Attributes.Add(new Attribute("Sql.Function", "Name=" + ToStringLiteral((p.Schema != null ? p.Schema + "." : null)  + p.ProcedureName), "ServerSideOnly=true"));
-			}
-			else
-			{
-				p.IsStatic    = true;
-				p.TypeBuilder = () => p.ResultTable == null
-					? "int"
-					: GenerateProcedureResultAsList
-						? "List<" + p.ResultTable.TypeName + ">"
-						: "IEnumerable<" + p.ResultTable.TypeName + ">";
-
-				if (p.IsDefaultSchema || !GenerateSchemaAsType)
-					p.ParameterBuilders.Add(() => "this DataConnection dataConnection");
-				else
-					p.ParameterBuilders.Add(() => "DataConnection dataConnection");
-			}
-
-			if (!p.IsAggregateFunction)
-				foreach (var pr in p.ProcParameters.Where(par => !par.IsResult))
-					p.ParameterBuilders.Add(() => string.Format("{0}{1} {2}",
-						pr.IsOut ? pr.IsIn ? "ref " : "out " : "", pr.ParameterType, pr.ParameterName));
-
-			if (p.IsTableFunction)
-			{
-				p.BodyBuilders.Add(() => new[]
-				{
-					string.Format("return " + thisDataContext + ".GetTable<{0}>(this, (MethodInfo)MethodBase.GetCurrentMethod()", p.ResultTable.TypeName)
-					+ (p.ProcParameters.Count == 0 ? ");" : ",")
-				});
-
-				for (var idx = 0; idx < p.ProcParameters.Count; idx++)
-				{
-					var i = idx;
-					p.BodyBuilders.Add(() => new []{ "\t" + p.ProcParameters[i].ParameterName + (i + 1 == p.ProcParameters.Count ? ");" : ",") });
-				}
-			}
-			else if (p.IsFunction)
-			{
-				p.BodyBuilders.Add(() => new [] { "throw new InvalidOperationException();" });
-			}
-			else
-			{
-				var spName =
-					SqlBuilder.BuildTableName(
-						new System.Text.StringBuilder(),
-						(string)SqlBuilder.Convert(DatabaseName,    LinqToDB.SqlProvider.ConvertType.NameToDatabase),
-						(string)SqlBuilder.Convert(p.Schema,        LinqToDB.SqlProvider.ConvertType.NameToSchema),
-						(string)SqlBuilder.Convert(p.ProcedureName, LinqToDB.SqlProvider.ConvertType.NameToQueryTable)
-					).ToString();
-
-				spName = ToStringLiteral(spName);
-
-				var inputParameters      = p.ProcParameters.Where(pp => pp.IsIn).            ToList();
-				var outputParameters     = p.ProcParameters.Where(pp => pp.IsOut).           ToList();
-				var inOrOutputParameters = p.ProcParameters.Where(pp => pp.IsIn || pp.IsOut).ToList();
-
-				spName += inOrOutputParameters.Count == 0
-					? (p.ResultTable == null || !GenerateProcedureResultAsList ? ");" : ").ToList();")
-					: ",";
-
-				var retName = "ret";
-				var retNo   = 0;
-
-				while (p.ProcParameters.Any(pp => pp.ParameterName == retName))
-					retName = "ret" + ++retNo;
-
-				var hasOut = outputParameters.Any(pr => pr.IsOut);
-				var prefix = hasOut ? "var " + retName + " = " : "return ";
-
-				if (p.ResultTable == null)
-					p.BodyBuilders.Add(() => new [] { prefix + "dataConnection.ExecuteProc(" + spName });
-				else
-				{
-					if (p.ResultTable.Columns.Values.Any(c => c.IsDuplicateOrEmpty))
-					{
-						p.BodyBuilders.Add(() => new []
-						{
-							"var ms = dataConnection.MappingSchema;",
-							"",
-							prefix + "dataConnection.QueryProc(dataReader =>",
-							"\tnew " + p.ResultTable.TypeName,
-							"\t{"
-						});
-
-						var n          = 0;
-						var maxNameLen = p.ResultTable.Columns.Values.Max(c => (int?)c.MemberName .Length) ?? 0;
-						var maxTypeLen = p.ResultTable.Columns.Values.Max(c => (int?)c.BuildType().Length) ?? 0;
-
-						foreach (var c in p.ResultTable.Columns.Values)
-						{
-							p.BodyBuilders.Add(() => new [] {string.Format("\t\t{0}{1} = Converter.ChangeTypeTo<{2}>{3}(dataReader.GetValue({4}), ms),",
-								c.MemberName, LenDiff(maxNameLen, c.MemberName), c.BuildType(), LenDiff(maxTypeLen, c.BuildType()), n++) });
-						}
-
-						p.BodyBuilders.Add(() => new [] {"\t},", "\t" + spName });
-					}
-					else
-					{
-						p.BodyBuilders.Add(() => new [] { prefix + "dataConnection.QueryProc<" + p.ResultTable.TypeName + ">(" + spName });
-					}
-				}
-
-				var maxLenSchema = inputParameters.Max(pr => (int?)pr.SchemaName.   Length) ?? 0;
-				var maxLenParam  = inputParameters.Max(pr => (int?)pr.ParameterName.Length) ?? 0;
-				var maxLenType   = inputParameters.Max(pr => (int?)("DataType." + pr.DataType).Length) ?? 0;
-
-				for (var idx = 0; idx < inOrOutputParameters.Count; idx++)
-				{
-					var i = idx;
-					var pr = inOrOutputParameters[i];
-
-					p.BodyBuilders.Add(() =>
-					{
-						var str = string.Format(
-							!pr.IsIn && pr.IsOut
-								? "\tnew DataParameter({0}, null, {3}{4})"
-								: "\tnew DataParameter({0}, {1}{2}, {3}{4})" + (GenerateProcedureDbType(pr) ? "{{ DbType = {5} }}" : null),
-							ToStringLiteral(pr.SchemaName),
-							LenDiff(maxLenSchema, pr.SchemaName),
-							pr.ParameterName,
-							LenDiff(maxLenParam, pr.ParameterName),
-							"DataType." + pr.DataType,
-							ToStringLiteral(pr.SchemaType));
-
-						if (pr.IsOut)
-						{
-							str += LenDiff(maxLenType, "DataType." + pr.DataType);
-							str += " { Direction = " + (pr.IsIn ? "ParameterDirection.InputOutput" : "ParameterDirection.Output");
-
-							if (pr.Size != null && pr.Size.Value != 0)
-								str += ", Size = " + pr.Size.Value;
-
-							str += " }";
-						}
-
-						// we need to call ToList(), because otherwise output parameters will not be updated
-						// with values. See https://msdn.microsoft.com/en-us/library/ms971497#gazoutas_topic6
-						str += i + 1 == inOrOutputParameters.Count
-							? ((GenerateProcedureResultAsList || outputParameters.Count > 0) && p.ResultTable != null ? ").ToList();" : ");")
-							: ",";
-
-						return new [] { str };
-					});
-				}
-
-				if (hasOut)
-				{
-					maxLenSchema = outputParameters.Max(pr => (int?)pr.SchemaName.   Length) ?? 0;
-					maxLenParam  = outputParameters.Max(pr => (int?)pr.ParameterName.Length) ?? 0;
-					maxLenType   = outputParameters.Max(pr => (int?)pr.ParameterType.Length) ?? 0;
-
-					p.BodyBuilders.Add(() => new [] { string.Empty });
-
-					foreach (var pr in p.ProcParameters.Where(_ => _.IsOut))
-					{
-						p.BodyBuilders.Add(() => new [] { string.Format("{0} {1}= Converter.ChangeTypeTo<{2}>{3}(((IDbDataParameter)dataConnection.Command.Parameters[{4}]).{5}Value);",
-							pr.ParameterName,
-							LenDiff(maxLenParam,  pr.ParameterName),
-							pr.ParameterType,
-							LenDiff(maxLenType,   pr.ParameterType),
-							ToStringLiteral(pr.SchemaName),
-							LenDiff(maxLenSchema, pr.SchemaName)) });
-					}
-
-					p.BodyBuilders.Add(() => new [] {"", "return " + retName + ";" });
-				}
-			}
-
-			if (p.ResultTable != null && p.ResultTable.DataContextPropertyName == null)
-			{
-				var columns = new MemberGroup { IsCompact = true };
-
-				foreach (var c in p.ResultTable.Columns.Values)
-				{
-					if (c.MemberName != c.ColumnName)
-						c.Attributes.Add(new Attribute("Column") { Parameters = { ToStringLiteral(c.ColumnName) } });
-					columns.Members.Add(c);
-				}
-
-				p.ResultTable.Members.Add(columns);
-				proc.Members.Add(p.ResultTable);
-			}
-		}
-
-		if (procs.Members.Count > 0)
-			Model.Types.Add(new Class(DataContextObject.Name + "StoredProcedures", procs) { IsStatic = true });
-
-		if (funcs.Members.Count > 0)
-			Model.Types.Add(new Class("SqlFunctions", funcs) { IsStatic = true });
-
-		if (tabfs.Members.Count > 0)
-			DataContextObject.Members.Add(tabfs);
-
-		MakeTypeMembersNamesUnique(DataContextObject, "InitDataContext", "InitMappingSchema");
-		MakeMembersNamesUnique(Model.Types, "Table");
-		foreach (var type in Model.Types.OfType<Class>())
-			MakeTypeMembersNamesUnique(type, exceptMethods: new [] { "Find", "InitDataContext", "InitMappingSchema" });
-
-		foreach (var schema in schemas.Values)
-		{
-			if (schema.Procedures.Members.Count > 0)
-				schema.Type.Members.Add(new Class(DataContextObject.Name + "StoredProcedures", schema.Procedures) { IsStatic = true });
-
-			if (schema.Functions.Members.Count > 0)
-				schema.Type.Members.Add(new Class("SqlFunctions", schema.Functions) { IsStatic = true });
-
-			if (schema.TableFunctions.Members.Count > 0)
-				schema.DataContext.Members.Add(schema.TableFunctions);
-
-			MakeTypeMembersNamesUnique(schema.DataContext, "InitDataContext", "InitMappingSchema");
-			foreach (var type in schema.Type.Members.OfType<Class>())
-				MakeTypeMembersNamesUnique(type);
-		}
-	}
-
-	if (defTableExtensions.Members.Count > 0)
-	{
-		Model.Usings.Add("System.Linq");
-		var tableExtensions = new Class("TableExtensions", defTableExtensions) { IsStatic = true };
-		Model.Types.Add(tableExtensions);
-		MakeTypeMembersNamesUnique(tableExtensions, exceptMethods: new [] { "Find" });
-	}
-
-	foreach (var schema in schemas.Values)
-	{
-		Model.Types.Add(schema.Type);
-
-		if (schema.TableExtensions.Members.Count > 0)
-		{
-			Model.Usings.Add("System.Linq");
-			schema.Type.Members.Add(schema.TableExtensions);
-		}
-	}
-
-	Tables.    Clear();
-	Procedures.Clear();
-
-	Model.SetTree();
-
-	AfterGenerateLinqToDBModel();
-}
-
-void MakeTypeMembersNamesUnique(Class type, string defaultName = "Member", params string[] exceptMethods)
-{
-	var reservedNames = new [] { type.Name };
-	if (exceptMethods != null && exceptMethods.Length > 0)
-		reservedNames = reservedNames.Concat(exceptMethods).ToArray();
-
-	MakeMembersNamesUnique(GetAllClassMembers(type.Members, exceptMethods), defaultName, reservedNames);
-}
-
-void MakeMembersNamesUnique(IEnumerable<IClassMember> members, string defaultName, params string[] reservedNames)
-{
-	LinqToDB.Common.Utils.MakeUniqueNames(
-		members,
-		reservedNames,
-		m => m is Table tbl ? (tbl.Schema != null && !tbl.IsDefaultSchema && PrefixTableMappingWithSchema ? tbl.Schema + "_" : null) + tbl.Name : (m is TypeBase t ? t.Name : ((MemberBase)m).Name),
-		(m, newName) =>
-		{
-			if (m is TypeBase t)
-				t.Name = newName;
-			else
-				((MemberBase)m).Name = newName;
-		},
-		defaultName);
-}
-
-IEnumerable<IClassMember> GetAllClassMembers(IEnumerable<IClassMember> members, params string[] exceptMethods)
-{
-	foreach (var member in members)
-	{
-		if (member is MemberGroup mg)
-			foreach (var m in GetAllClassMembers(mg.Members, exceptMethods))
-				yield return m;
-		// constructors don't have own type/flag
-		else if (member is Method method && (method.BuildType() == null || (exceptMethods != null && exceptMethods.Contains(method.Name))))
-			continue;
-		else
-			yield return member;
-	}
-}
-
-// left for backward compatibility
-string NormalizeStringName(string name)
-{
-	return ToStringLiteral(name);
-}
-
-#>
diff --git a/src/Version/LinqToDB.Templates/MultipleFiles.ttinclude b/src/Version/LinqToDB.Templates/MultipleFiles.ttinclude
deleted file mode 100644
index 4b43ba0cb45ef6415572f3758f81c3cec9fc9c93..0000000000000000000000000000000000000000
--- a/src/Version/LinqToDB.Templates/MultipleFiles.ttinclude
+++ /dev/null
@@ -1,70 +0,0 @@
-<#@ assembly name="System.Core"                   #>
-<#@ assembly name="EnvDTE"                        #>
-<#@ import namespace="System.Collections.Generic" #>
-<#@ import namespace="System.IO"                  #>
-<#@ import namespace="System.Linq"                #>
-<#@ import namespace="EnvDTE"                     #>
-<#+
-DTE _dte;
-DTE  DTE => _dte ?? (_dte = (DTE)((IServiceProvider)Host).GetService(typeof(DTE)));
-
-ProjectItem _templateProjectItem;
-ProjectItem  TemplateProjectItem => _templateProjectItem ?? (_templateProjectItem = DTE.Solution.FindProjectItem(Host.TemplateFile));
-
-readonly Dictionary<string,int> _fileNames = new Dictionary<string,int>();
-
-Func<string,string,bool> CompareContent = (s1,s2) => s1 == s2;
-
-void SaveOutput(string fileName, int fileType = 1)
-{
-	var dir        = Path.GetDirectoryName(Host.TemplateFile);
-	var output     = Path.Combine(dir, fileName);
-	var newContent = GenerationEnvironment.ToString();
-	var oldContent = File.Exists(output) ? File.ReadAllText(output) : "";
-
-	if (!CompareContent(newContent, oldContent))
-	{
-		if (DTE.SourceControl != null && DTE.SourceControl.IsItemUnderSCC(output) && !DTE.SourceControl.IsItemCheckedOut(output))
-			DTE.SourceControl.CheckOutItem(output);
-
-		File.WriteAllText(output, newContent);
-	}
-
-	GenerationEnvironment.Length = 0;
-
-	_fileNames.Add(output, fileType);
-}
-
-void SyncProject()
-{
-	var keepFileNames      = _fileNames.ToDictionary(f => f.Key);
-	var projectFiles       = new Dictionary<string,ProjectItem>();
-	var templateFileName   = TemplateProjectItem.FileNames[0];
-	var originalFilePrefix = Path.GetFileNameWithoutExtension(templateFileName) + ".";
-
-	foreach (ProjectItem projectItem in TemplateProjectItem.ProjectItems)
-	{
-		projectFiles.Add(projectItem.FileNames[0], projectItem);
-	}
-
-	foreach (var pair in projectFiles)
-	{
-		if (!keepFileNames.ContainsKey(pair.Key))
-			if (!(Path.GetFileNameWithoutExtension(pair.Key) + ".").StartsWith(originalFilePrefix))
-			//if (pair.Key != templateFileName)
-				pair.Value.Delete();
-	}
-
-	// Add missing files to the project.
-	//
-	foreach (var fileName in keepFileNames)
-	{
-		if (!projectFiles.ContainsKey(fileName.Value.Key))
-		if (File.Exists(fileName.Value.Key))
-		{
-			var newItem = TemplateProjectItem.ProjectItems.AddFromFile(fileName.Value.Key);
-			newItem.Properties.Item("BuildAction").Value = fileName.Value.Value;
-		}
-	}
-}
-#>
diff --git a/src/Version/LinqToDB.Templates/NotifyDataErrorInfo.ttinclude b/src/Version/LinqToDB.Templates/NotifyDataErrorInfo.ttinclude
deleted file mode 100644
index 06e72afe36bacddb7945459593de4a5bf6e93a79..0000000000000000000000000000000000000000
--- a/src/Version/LinqToDB.Templates/NotifyDataErrorInfo.ttinclude
+++ /dev/null
@@ -1,133 +0,0 @@
-<#
-	{
-		var beforeGenerateModel = BeforeGenerateModel;
-		BeforeGenerateModel = () =>
-		{
-			beforeGenerateModel();
-			NotifyDataErrorInfoImpl();
-		};
-	}
-#>
-<#+
-void NotifyDataErrorInfoImpl()
-{
-	foreach (var prop in  GetTreeNodes(Model).OfType<Property>().Where(p => p.CustomValidation).ToList())
-	{
-		ITree p = prop.Parent;
-
-		while (!(p is Class) && p != null)
-			p = p.Parent;
-
-		if (p != null)
-		{
-			var cl = (Class)p;
-
-			if (!cl.Interfaces.Contains("INotifyDataErrorInfo"))
-			{
-				if (!Model.Usings.Contains("System.ComponentModel")) Model.Usings.Add("System.ComponentModel");
-				if (!Model.Usings.Contains("System.Collections"))    Model.Usings.Add("System.Collections");
-				if (!Model.Usings.Contains("System.Linq"))           Model.Usings.Add("System.Linq");
-
-				cl.Interfaces.Add("INotifyDataErrorInfo");
-
-				cl.Members.Add(new MemberGroup
-				{
-					Region  = "INotifyDataErrorInfo support",
-					Members =
-					{
-						new Event(() => "EventHandler<DataErrorsChangedEventArgs>", "ErrorsChanged")
-						{
-							IsVirtual  = true,
-							Attributes = { new Attribute("field : NonSerialized") { Conditional = "!SILVERLIGHT" } }
-						},
-						new Field(() => "Dictionary<string,List<string>>", "_validationErrors")
-						{
-							InitValue      = "new Dictionary<string,List<string>>()",
-							AccessModifier = AccessModifier.Private,
-							IsReadonly     = true,
-							Attributes     = { new Attribute("field : NonSerialized") { Conditional = "!SILVERLIGHT" } }
-						},
-						new Method(() => "void", "AddError",
-							new Func<string>[]
-							{
-								() => "string propertyName",
-								() => "string error"
-							},
-							() => new[]
-							{
-								"List<string> errors;",
-								"",
-								"if (!_validationErrors.TryGetValue(propertyName, out errors))",
-								"{",
-									"\t_validationErrors[propertyName] = new List<string> { error };",
-								"}",
-								"else if (!errors.Contains(error))",
-								"{",
-									"\terrors.Add(error);",
-								"}",
-								"else",
-									"\treturn;",
-								"",
-								"OnErrorsChanged(propertyName);",
-							})
-						{
-							AccessModifier = AccessModifier.Public
-						},
-						new Method(() => "void", "RemoveError",
-							new Func<string>[]
-							{
-								() => "string propertyName",
-							},
-							() => new[]
-							{
-								"List<string> errors;",
-								"",
-								"if (_validationErrors.TryGetValue(propertyName, out errors) && errors.Count > 0)",
-								"{",
-									"\t_validationErrors.Clear();",
-									"\tOnErrorsChanged(propertyName);",
-								"}",
-							})
-						{
-							AccessModifier = AccessModifier.Public
-						},
-						new Method(() => "void", "OnErrorsChanged",
-							new Func<string>[]
-							{
-								() => "string propertyName",
-							},
-							() => new[]
-							{
-								"if (ErrorsChanged != null)",
-								"{",
-									"\tif (System.Windows.Deployment.Current.Dispatcher.CheckAccess())",
-										"\t\tErrorsChanged(this, new DataErrorsChangedEventArgs(propertyName));",
-									"\telse",
-										"\t\tSystem.Windows.Deployment.Current.Dispatcher.BeginInvoke(",
-											"\t\t\t() => ErrorsChanged(this, new DataErrorsChangedEventArgs(propertyName)));",
-								"}",
-							})
-						{
-							AccessModifier = AccessModifier.Protected
-						},
-						new Method(() => "IEnumerable", "GetErrors",
-							new Func<string>[]
-							{
-								() => "string propertyName",
-							},
-							() => new[]
-							{
-								"List<string> errors;",
-								"return propertyName != null && _validationErrors.TryGetValue(propertyName, out errors) ? errors : null;",
-							})
-						{
-							AccessModifier = AccessModifier.Public
-						},
-						new Property(() => "bool", "HasErrors").InitGetter(() => new [] { "_validationErrors.Values.Any(e => e.Count > 0)" })
-					}
-				});
-			}
-		}
-	}
-}
-#>
diff --git a/src/Version/LinqToDB.Templates/NotifyPropertyChanged.ttinclude b/src/Version/LinqToDB.Templates/NotifyPropertyChanged.ttinclude
deleted file mode 100644
index 49234e7df4ac27c2f5f6314587a7396bcac16a53..0000000000000000000000000000000000000000
--- a/src/Version/LinqToDB.Templates/NotifyPropertyChanged.ttinclude
+++ /dev/null
@@ -1,382 +0,0 @@
-<#
-	{
-		var beforeGenerateModel = BeforeGenerateModel;
-		BeforeGenerateModel = () =>
-		{
-			beforeGenerateModel();
-			NotifyPropertyChangedImpl();
-		};
-
-		SetPropertyValueAction += (obj,prop,val) =>
-		{
-			if (prop == "IsNotifying")
-				obj.IsNotifying = (bool)val;
-		};
-	}
-#><#+
-public bool ImplementNotifyPropertyChanging;
-public bool SkipNotifyPropertyChangedImplementation = false;
-
-void NotifyPropertyChangedImpl()
-{
-	foreach (Property prop in GetTreeNodes(Model).OfType<Property>().Where(p => p.IsNotifying).ToList())
-	{
-		List<IClassMember> parentMembers;
-
-		MemberGroup gr = null;
-
-		if (prop.Parent is Class)
-		{
-			var parent = (Class)prop.Parent;
-			parentMembers = parent.Members;
-		}
-		else
-		{
-			var parent = (MemberGroup)prop.Parent;
-
-			parent.IsCompact = false;
-
-			parentMembers = parent.Members;
-
-			if (parent.IsPropertyGroup)
-				gr = parent;
-		}
-
-		var name = prop.Name.Trim();
-		var type = prop.BuildType().Trim();
-
-		if (gr == null)
-		{
-			gr = new MemberGroup
-			{
-				Region          = name + " : " + type,
-				Members         = { prop },
-				IsPropertyGroup = true,
-			};
-
-			var index = parentMembers.IndexOf(prop);
-
-			parentMembers.RemoveAt(index);
-			parentMembers.Insert  (index, gr);
-		}
-
-		if (prop.IsAuto)
-		{
-			var field = new Field(() => type, "_" + ToCamelCase(name))
-			{
-				AccessModifier       = AccessModifier.Private,
-				InsertBlankLineAfter = false,
-			};
-
-			if (prop.InitValue != null)
-				field.InitValue = prop.InitValue;
-
-			gr.Members.Insert(0, field);
-
-			prop.Name        = " " + name;
-			prop.TypeBuilder = () => " " + type;
-			prop.IsAuto      = false;
-
-			if (prop.HasGetter) prop.GetBodyBuilders.Add(() => new [] { "return " + field.Name + ";" });
-			if (prop.HasSetter) prop.SetBodyBuilders.Add(() => new [] { field.Name + " = value;" });
-		}
-
-		var methods = new MemberGroup
-		{
-			Region  = "INotifyPropertyChanged support",
-			Members =
-			{
-				new Field(() => "const string", "NameOf" + name)
-				{
-					InitValue      = ToStringLiteral(name),
-					AccessModifier = AccessModifier.Public,
-				},
-				new Field(() => "PropertyChangedEventArgs", "_" + ToCamelCase(name) + "ChangedEventArgs")
-				{
-					InitValue      = "new PropertyChangedEventArgs(NameOf" + name + ")",
-					AccessModifier = AccessModifier.Private,
-					IsStatic       = true,
-					IsReadonly     = true,
-				},
-				new Method(() => "void", "On" + name + "Changed", null,
-					() => new[] { "OnPropertyChanged(_" + ToCamelCase(name) + "ChangedEventArgs);" })
-				{
-					AccessModifier = AccessModifier.Private
-				}
-			}
-		};
-
-		gr.Members.Add(methods);
-
-		if (prop.Dependents.Count == 0)
-			prop.Dependents.Add(name);
-
-		if (ImplementNotifyPropertyChanging)
-		{
-			gr.Members.Add(new MemberGroup
-			{
-				Region  = "INotifyPropertyChanging support",
-				Members =
-				{
-					new Field(() => "PropertyChangingEventArgs", "_" + ToCamelCase(name) + "ChangingEventArgs")
-					{
-						InitValue      = "new PropertyChangingEventArgs(NameOf" + name + ")",
-						AccessModifier = AccessModifier.Private,
-						IsStatic       = true,
-						IsReadonly     = true,
-					},
-					new Method(() => "void", "On" + name + "Changing", null,
-						() => new[] { "OnPropertyChanging(_" + ToCamelCase(name) + "ChangingEventArgs);" })
-					{
-						AccessModifier = AccessModifier.Private
-					}
-				}
-			});
-		}
-
-		if (prop.HasSetter)
-		{
-			var setBody = prop.BuildSetBody().Select(s => "\t" + s).ToArray();
-			prop.SetBodyBuilders.Clear();
-			prop.SetBodyBuilders.Add(() => setBody);
-
-			string getValue;
-
-			var getBody = prop.BuildGetBody().ToArray();
-			if (getBody.Length == 1 && getBody[0].StartsWith("return"))
-			{
-				getValue = getBody[0].Substring("return".Length).Trim(' ', '\t', ';');
-			}
-			else
-			{
-				getValue = name;
-			}
-
-			var insSpaces = setBody.Length > 1;
-			var n = 0;
-
-			prop.SetBodyBuilders.Insert(n++, () => new [] {"if (" + getValue + " != value)", "{" });
-
-			if (ImplementNotifyPropertyChanging)
-			{
-				foreach (var dp in prop.Dependents)
-					prop.SetBodyBuilders.Insert(n++, () => new [] { "\tOn" + dp + "Changing();" });
-				prop.SetBodyBuilders.Insert(n++, () => new [] { "" });
-			}
-
-			prop.SetBodyBuilders.Insert(n++, () => new [] { "\tBefore" + name + "Changed(value);" });
-
-			if (insSpaces)
-			{
-				prop.SetBodyBuilders.Insert(3, () => new [] { "" });
-				prop.SetBodyBuilders.Add(() => new [] { "" });
-			}
-
-			prop.SetBodyBuilders.Add(() => new [] { "\tAfter" + name + "Changed();" });
-			prop.SetBodyBuilders.Add(() => new [] { "" });
-
-			foreach (var dp in prop.Dependents)
-				prop.SetBodyBuilders.Add(() => new [] { "\tOn" + dp + "Changed();" });
-
-			prop.SetBodyBuilders.Add(() => new [] { "}" });
-
-			methods.Members.Insert(0, new MemberGroup
-			{
-				IsCompact = true,
-				Members   =
-				{
-					new Method(() => "void", "Before" + name + "Changed", new Func<string>[] { () => type + " newValue" }) { AccessModifier = AccessModifier.Partial },
-					new Method(() => "void", "After"  + name + "Changed") { AccessModifier = AccessModifier.Partial },
-				}
-			});
-		}
-
-		prop.Parent.SetTree();
-
-		ITree p = prop.Parent;
-
-		while (!(p is Class) && p != null)
-			p = p.Parent;
-
-		if (p != null)
-		{
-			var cl = (Class)p;
-
-			if (!SkipNotifyPropertyChangedImplementation && !cl.Interfaces.Contains("INotifyPropertyChanged"))
-			{
-				if (!Model.Usings.Contains("System.ComponentModel"))
-					Model.Usings.Add("System.ComponentModel");
-
-				cl.Interfaces.Add("INotifyPropertyChanged");
-
-				cl.Members.Add(new MemberGroup
-				{
-					Region  = "INotifyPropertyChanged support",
-					Members =
-					{
-						new Event(() => "PropertyChangedEventHandler", "PropertyChanged")
-						{
-							IsVirtual  = true,
-							Attributes = { new Attribute("field : NonSerialized") { Conditional = "!SILVERLIGHT" } }
-						},
-						new Method(() => "void", "OnPropertyChanged", new Func<string>[] { () => "string propertyName" }, () => OnPropertyChangedBody)
-						{
-							AccessModifier = AccessModifier.Protected
-						},
-						new Method(() => "void", "OnPropertyChanged", new Func<string>[] { () => "PropertyChangedEventArgs arg" }, () => OnPropertyChangedArgBody)
-						{
-							AccessModifier = AccessModifier.Protected
-						},
-					}
-				});
-			}
-
-			if (ImplementNotifyPropertyChanging && !cl.Interfaces.Contains("INotifyPropertyChanging"))
-			{
-				if (!Model.Usings.Contains("System.ComponentModel"))
-					Model.Usings.Add("System.ComponentModel");
-
-				cl.Interfaces.Add("INotifyPropertyChanging");
-
-				cl.Members.Add(new MemberGroup
-				{
-					Region  = "INotifyPropertyChanging support",
-					Members =
-					{
-						new Event(() => "PropertyChangingEventHandler", "PropertyChanging")
-						{
-							IsVirtual  = true,
-							Attributes = { new Attribute("field : NonSerialized") { Conditional = "!SILVERLIGHT" } }
-						},
-						new Method(() => "void", "OnPropertyChanging", new Func<string>[] { () => "string propertyName" }, () => OnPropertyChangingBody)
-						{
-							AccessModifier = AccessModifier.Protected
-						},
-						new Method(() => "void", "OnPropertyChanging", new Func<string>[] { () => "PropertyChangingEventArgs arg" }, () => OnPropertyChangingArgBody)
-						{
-							AccessModifier = AccessModifier.Protected
-						},
-					}
-				});
-			}
-		}
-	}
-}
-
-public string[] OnPropertyChangedBody = new[]
-{
-	"var propertyChanged = PropertyChanged;",
-	"",
-	"if (propertyChanged != null)",
-	"{",
-	"#if SILVERLIGHT",
-	"\tif (System.Windows.Deployment.Current.Dispatcher.CheckAccess())",
-	"\t\tpropertyChanged(this, new PropertyChangedEventArgs(propertyName));",
-	"\telse",
-	"\t\tSystem.Windows.Deployment.Current.Dispatcher.BeginInvoke(",
-	"\t\t\t() =>",
-	"\t\t\t{",
-	"\t\t\t\tvar pc = PropertyChanged;",
-	"\t\t\t\tif (pc != null)",
-	"\t\t\t\t\tpc(this, new PropertyChangedEventArgs(propertyName));",
-	"\t\t\t});",
-	"#else",
-	"\tpropertyChanged(this, new PropertyChangedEventArgs(propertyName));",
-	"#endif",
-	"}",
-};
-
-public string[] OnPropertyChangedArgBody = new[]
-{
-	"var propertyChanged = PropertyChanged;",
-	"",
-	"if (propertyChanged != null)",
-	"{",
-	"#if SILVERLIGHT",
-	"\tif (System.Windows.Deployment.Current.Dispatcher.CheckAccess())",
-	"\t\tpropertyChanged(this, arg);",
-	"\telse",
-	"\t\tSystem.Windows.Deployment.Current.Dispatcher.BeginInvoke(",
-	"\t\t\t() =>",
-	"\t\t\t{",
-	"\t\t\t\tvar pc = PropertyChanged;",
-	"\t\t\t\tif (pc != null)",
-	"\t\t\t\t\tpc(this, arg);",
-	"\t\t\t});",
-	"#else",
-	"\tpropertyChanged(this, arg);",
-	"#endif",
-	"}",
-};
-
-public string[] OnPropertyChangingBody = new[]
-{
-	"var propertyChanging = PropertyChanging;",
-	"",
-	"if (propertyChanging != null)",
-	"{",
-	"#if SILVERLIGHT",
-	"\tif (System.Windows.Deployment.Current.Dispatcher.CheckAccess())",
-	"\t\tpropertyChanging(this, new PropertyChangingEventArgs(propertyName));",
-	"\telse",
-	"\t\tSystem.Windows.Deployment.Current.Dispatcher.BeginInvoke(",
-	"\t\t\t() =>",
-	"\t\t\t{",
-	"\t\t\t\tvar pc = PropertyChanging;",
-	"\t\t\t\tif (pc != null)",
-	"\t\t\t\t\tpc(this, new PropertyChangingEventArgs(propertyName));",
-	"\t\t\t});",
-	"#else",
-	"\tpropertyChanging(this, new PropertyChangingEventArgs(propertyName));",
-	"#endif",
-	"}",
-};
-
-public string[] OnPropertyChangingArgBody = new[]
-{
-	"var propertyChanging = PropertyChanging;",
-	"",
-	"if (propertyChanging != null)",
-	"{",
-	"#if SILVERLIGHT",
-	"\tif (System.Windows.Deployment.Current.Dispatcher.CheckAccess())",
-	"\t\tpropertyChanging(this, arg);",
-	"\telse",
-	"\t\tSystem.Windows.Deployment.Current.Dispatcher.BeginInvoke(",
-	"\t\t\t() =>",
-	"\t\t\t{",
-	"\t\t\t\tvar pc = PropertyChanging;",
-	"\t\t\t\tif (pc != null)",
-	"\t\t\t\t\tpc(this, arg);",
-	"\t\t\t});",
-	"#else",
-	"\tpropertyChanging(this, arg);",
-	"#endif",
-	"}",
-};
-
-partial class Property
-{
-	public bool         IsNotifying;
-	public List<string> Dependents = new List<string>();
-}
-
-class NotifyingProperty : Property
-{
-	public NotifyingProperty()
-	{
-		IsNotifying = true;
-	}
-
-	public NotifyingProperty(string type, string name, params string[] dependents)
-		: base(() => type, name, null, null)
-	{
-		IsNotifying = true;
-
-		if (dependents.Length == 0)
-			Dependents.Add(name);
-		else
-			Dependents.AddRange(dependents);
-	}
-}
-#>
diff --git a/src/Version/LinqToDB.Templates/ObsoleteAttributes.ttinclude b/src/Version/LinqToDB.Templates/ObsoleteAttributes.ttinclude
deleted file mode 100644
index b95b0d894120fb8d42eb07cf84319f9c2e92def8..0000000000000000000000000000000000000000
--- a/src/Version/LinqToDB.Templates/ObsoleteAttributes.ttinclude
+++ /dev/null
@@ -1,100 +0,0 @@
-<#
-	{
-		var beforeGenerateLinqToDBModel = BeforeGenerateLinqToDBModel;
-		var afterGenerateLinqToDBModel  = AfterGenerateLinqToDBModel;
-
-		var obsoleteTables = new List<Tuple<string,string,string>>();
-
-		BeforeGenerateLinqToDBModel = () =>
-		{
-			beforeGenerateLinqToDBModel();
-
-			foreach (var table in Tables.Values)
-			{
-				var idx = table.Description.IndexOf("[Obsolete");
-
-				if (idx >= 0)
-				{
-					var idx2 = table.Description.IndexOf(']', idx);
-
-					if (idx2 > idx)
-					{
-						var text = table.Description.Substring(idx + 1, idx2 - idx - 1);
-						var attr = new Attribute(text);
-						var info = Tuple.Create(table.Schema, table.Name, text);
-
-						if (obsoleteTables.All(a => a != info))
-							obsoleteTables.Add(info);
-						table.Attributes.Add(attr);
-						table.Description = table.Description.Substring(0, idx) + table.Description.Substring(idx2 + 1);
-					}
-				}
-
-				foreach (var c in table.Columns.Values)
-				{
-					idx = c.Description.IndexOf("[Obsolete");
-
-					if (idx >= 0)
-					{
-						var idx2 = c.Description.IndexOf(']', idx);
-
-						if (idx2 > idx)
-						{
-							var attr = new Attribute(c.Description.Substring(idx + 1, idx2 - idx - 1));
-
-							c.Attributes.Add(attr);
-							c.Description = c.Description.Substring(0, idx) + c.Description.Substring(idx2 + 1);
-						}
-					}
-				}
-			}
-		};
-
-		AfterGenerateLinqToDBModel = () =>
-		{
-			foreach (var tableInfo in obsoleteTables)
-			{
-				var schema       = tableInfo.Item1;
-				var name         = tableInfo.Item2;
-				var text         = tableInfo.Item3;
-				var obsoleteAttr = new Attribute(text);
-
-				foreach (var cm in GetTreeNodes(Model)
-					.OfType<MemberBase>()
-					.Where(t => t.BuildType() != null)
-					.Where(t => t.BuildType() == name || t.BuildType().Contains("<" + name + ">")))
-				{
-					// check schema
-
-					if (cm.Parent != null && cm.Parent.Parent != null)
-					{
-						var parent = cm.Parent.Parent;
-
-						if (parent is Table)
-						{
-							var table = (Table)parent;
-
-							if (schema == table.Schema)
-								if (cm.Attributes.All(a => a.Name != text))
-									cm.Attributes.Add(obsoleteAttr);
-						}
-						else if (parent is Class)
-						{
-							var cls = (Class)parent;
-
-							bool parentClassIncludesSchemaName = cls.Name.Equals(schema + "Schema", StringComparison.InvariantCultureIgnoreCase);
-							bool classIsForDefaultSchema       = cls.Name == DataContextName;
-							bool isExtensionMethod             = cls.Parent is Namespace || cls.Name == "TableExtensions";
-
-							if (classIsForDefaultSchema || parentClassIncludesSchemaName || isExtensionMethod)
-								if (cm.Attributes.All(a => a.Name != text))
-									cm.Attributes.Add(obsoleteAttr);
-						}
-					}
-				}
-			}
-
-			afterGenerateLinqToDBModel();
-		};
-	}
-#>
diff --git a/src/Version/LinqToDB.Templates/PluralizationService.ttinclude b/src/Version/LinqToDB.Templates/PluralizationService.ttinclude
deleted file mode 100644
index 2bed1d6fe7c818c122b539e4f88a5acb1486186f..0000000000000000000000000000000000000000
--- a/src/Version/LinqToDB.Templates/PluralizationService.ttinclude
+++ /dev/null
@@ -1,185 +0,0 @@
-<#@ assembly name="System.Data.Entity.Design"                          #>
-<#@ import namespace="System.Data.Entity.Design.PluralizationServices" #>
-<#
-	{
-		ToPlural   = Pluralization.ToPlural;
-		ToSingular = Pluralization.ToSingular;
-	}
-#>
-<#+
-static class Pluralization
-{
-	public static string CultureInfo = "en";
-
-	static PluralizationService _service;
-
-	public static Dictionary<string,string> Dictionary = new Dictionary<string,string>
-	{
-		{ "access",       "accesses"     }, { "afterlife",    "afterlives"   }, { "alga",         "algae"        },
-		{ "alumna",       "alumnae"      }, { "alumnus",      "alumni"       }, { "analysis",     "analyses"     },
-		{ "antenna",      "antennae"     }, { "appendix",     "appendices"   }, { "axis",         "axes"         },
-		{ "bacillus",     "bacilli"      }, { "basis",        "bases"        }, { "Bedouin",      "Bedouin"      },
-		{ "cactus",       "cacti"        }, { "calf",         "calves"       }, { "cherub",       "cherubim"     },
-		{ "child",        "children"     }, { "cod",          "cod"          }, { "cookie",       "cookies"      },
-		{ "criterion",    "criteria"     }, { "curriculum",   "curricula"    }, { "data",         "data"         },
-		{ "deer",         "deer"         }, { "diagnosis",    "diagnoses"    }, { "die",          "dice"         },
-		{ "dormouse",     "dormice"      }, { "elf",          "elves"        }, { "elk",          "elk"          },
-		{ "erratum",      "errata"       }, { "esophagus",    "esophagi"     }, { "fauna",        "faunae"       },
-		{ "fish",         "fish"         }, { "flora",        "florae"       }, { "focus",        "foci"         },
-		{ "foot",         "feet"         }, { "formula",      "formulae"     }, { "fundus",       "fundi"        },
-		{ "fungus",       "fungi"        }, { "genie",        "genii"        }, { "genus",        "genera"       },
-		{ "goose",        "geese"        }, { "grouse",       "grouse"       }, { "hake",         "hake"         },
-		{ "half",         "halves"       }, { "headquarters", "headquarters" }, { "hippo",        "hippos"       },
-		{ "hippopotamus", "hippopotami"  }, { "hoof",         "hooves"       }, { "housewife",    "housewives"   },
-		{ "hypothesis",   "hypotheses"   }, { "index",        "indices"      }, { "info",         "info"         },
-		{ "jackknife",    "jackknives"   },
-		{ "knife",        "knives"       }, { "labium",       "labia"        }, { "larva",        "larvae"       },
-		{ "leaf",         "leaves"       }, { "life",         "lives"        }, { "loaf",         "loaves"       },
-		{ "louse",        "lice"         }, { "magus",        "magi"         }, { "man",          "men"          },
-		{ "memorandum",   "memoranda"    }, { "midwife",      "midwives"     }, { "millennium",   "millennia"    },
-		{ "moose",        "moose"        }, { "mouse",        "mice"         }, { "nebula",       "nebulae"      },
-		{ "neurosis",     "neuroses"     }, { "nova",         "novas"        }, { "nucleus",      "nuclei"       },
-		{ "oesophagus",   "oesophagi"    }, { "offspring",    "offspring"    }, { "ovum",         "ova"          },
-		{ "ox",           "oxen"         }, { "papyrus",      "papyri"       }, { "passerby",     "passersby"    },
-		{ "penknife",     "penknives"    }, { "person",       "people"       }, { "phenomenon",   "phenomena"    },
-		{ "placenta",     "placentae"    }, { "pocketknife",  "pocketknives" }, { "process",      "processes"    },
-		{ "pupa",         "pupae"        }, { "radius",       "radii"        }, { "reindeer",     "reindeer"     },
-		{ "retina",       "retinae"      }, { "rhinoceros",   "rhinoceros"   }, { "roe",          "roe"          },
-		{ "salmon",       "salmon"       }, { "scarf",        "scarves"      }, { "self",         "selves"       },
-		{ "seraph",       "seraphim"     }, { "series",       "series"       }, { "sheaf",        "sheaves"      },
-		{ "sheep",        "sheep"        }, { "shelf",        "shelves"      }, { "species",      "species"      },
-		{ "spectrum",     "spectra"      }, { "status",       "status"       }, { "stimulus",     "stimuli"      },
-		{ "stratum",      "strata"       }, { "supernova",    "supernovas"   }, { "swine",        "swine"        },
-		{ "terminus",     "termini"      }, { "thesaurus",    "thesauri"     }, { "thesis",       "theses"       },
-		{ "thief",        "thieves"      }, { "trout",        "trout"        }, { "vulva",        "vulvae"       },
-		{ "wife",         "wives"        }, { "wildebeest",   "wildebeest"   }, { "wolf",         "wolves"       },
-		{ "woman",        "women"        }, { "yen",          "yen"          },
-	};
-
-	static string GetLastWord(string str)
-	{
-		if (string.IsNullOrWhiteSpace(str))
-			return string.Empty;
-
-		var i = str.Length - 1;
-		var isLower = char.IsLower(str[i]);
-
-		while (i > 0 && char.IsLetter(str[i - 1]) && char.IsLower(str[i - 1]) == isLower)
-			i--;
-
-		return str.Substring(isLower && i > 0 && char.IsLetter(str[i - 1]) ? i - 1 : i);
-	}
-
-	public static string ToPlural(string str)
-	{
-		if (_service == null)
-			_service = PluralizationService.CreateService(System.Globalization.CultureInfo.GetCultureInfo(CultureInfo));
-
-		var word = GetLastWord(str);
-
-		string newWord;
-
-		if (!Dictionary.TryGetValue(word.ToLower(), out newWord))
-			newWord = _service.IsPlural(word) ? word : _service.Pluralize(word);
-
-		if (string.Compare(word, newWord, true) != 0)
-		{
-			if (char.IsUpper(word[0]))
-				newWord = char.ToUpper(newWord[0]) + newWord.Substring(1, newWord.Length - 1).ToLower();
-
-			return word == str ? newWord : str.Substring(0, str.Length - word.Length) + newWord;
-		}
-
-		return str;
-	}
-
-	public static string ToSingular(string str)
-	{
-		if (_service == null)
-			_service = PluralizationService.CreateService(System.Globalization.CultureInfo.GetCultureInfo(CultureInfo));
-
-		var word = GetLastWord(str);
-
-		var newWord =
-			Dictionary
-				.Where(dic => string.Compare(dic.Value, word, true) == 0)
-				.Select(dic => dic.Key)
-				.FirstOrDefault()
-			??
-			(_service.IsSingular(word) ? word : _service.Singularize(word));
-
-		if (string.Compare(word, newWord, true) != 0)
-		{
-			if (char.IsUpper(word[0]))
-				newWord = char.ToUpper(newWord[0]) + newWord.Substring(1, newWord.Length - 1);
-
-			return word == str ? newWord : str.Substring(0, str.Length - word.Length) + newWord;
-		}
-
-		return str;
-	}
-
-	static string GetLastWordVersion1(string str)
-	{
-		if (string.IsNullOrWhiteSpace(str))
-			return string.Empty;
-
-		var i       = str.Length - 1;
-		var isLower = char.IsLower(str[i]);
-
-		while (i > 0 && char.IsLower(str[i-1]) == isLower)
-			i--;
-
-		return str.Substring(isLower && i > 0 ? i - 1 : i);
-	}
-
-	public static string ToPluralVersion1(string str)
-	{
-		if (_service == null)
-			_service = PluralizationService.CreateService(System.Globalization.CultureInfo.GetCultureInfo(CultureInfo));
-
-		var word = GetLastWordVersion1(str);
-
-		string newWord;
-
-		if (!Dictionary.TryGetValue(word.ToLower(), out newWord))
-			newWord = _service.IsPlural(word) ? word : _service.Pluralize(word);
-
-		if (string.Compare(word, newWord, true) != 0)
-		{
-			if (char.IsUpper(word[0]))
-				newWord = char.ToUpper(newWord[0]) + newWord.Substring(1, newWord.Length - 1);
-
-			return word == str ? newWord : str.Substring(0, str.Length - word.Length) + newWord;
-		}
-
-		return str;
-	}
-
-	public static string ToSingularVersion1(string str)
-	{
-		if (_service == null)
-			_service = PluralizationService.CreateService(System.Globalization.CultureInfo.GetCultureInfo(CultureInfo));
-
-		var word = GetLastWordVersion1(str);
-
-		var newWord =
-			Dictionary
-				.Where(dic => string.Compare(dic.Value, word, true) == 0)
-				.Select(dic => dic.Key)
-				.FirstOrDefault()
-			??
-			(_service.IsSingular(word) ? word : _service.Singularize(word));
-
-		if (string.Compare(word, newWord, true) != 0)
-		{
-			if (char.IsUpper(word[0]))
-				newWord = char.ToUpper(newWord[0]) + newWord.Substring(1, newWord.Length - 1);
-
-			return word == str ? newWord : str.Substring(0, str.Length - word.Length) + newWord;
-		}
-
-		return str;
-	}
-}
-#>
diff --git a/src/Version/LinqToDB.Templates/README.md b/src/Version/LinqToDB.Templates/README.md
deleted file mode 100644
index 0c16bb299841c238e9838723a22350d31fb0800f..0000000000000000000000000000000000000000
--- a/src/Version/LinqToDB.Templates/README.md
+++ /dev/null
@@ -1,383 +0,0 @@
-# T4 Models
-
-T4 models are used to generate POCO's C# code using your database structure.
-
-## Installation
-
-Firstly you should install one of tools packages into your project:
-
-`Install-Package linq2db.XXX`
-
-Where XXX is one of supported databases, for example:
-
-`Install-Package linq2db.SqlServer`
-
-This also will install needed linq2db packages:
-
-* linq2db.t4models
-* linq2db 
-
-But **not** data provider packages (install them only if needed to compile your project, T4 models ships it's own data provider assemblies).
-
-### .Net Core specific
-
-Because of .Net Core projects do not support NuGet content files all stuff is not copied into project's folder, so to run T4 templates you'll need:
-
-* open `$(SolutionDir).tools\linq2db.t4models` in Explorer 
-* copy `CopyMe.XXX.Core.tt.txt` to your project's folder or subfolder, then you should use it instead of `CopyMe.XXX.tt.txt`
-
-## Running
-
-After package installing you will see new `LinqToDB.Templates` folder in your project, this folder contains all needed T4 stuff to generate your model. Also would be created new folder in tour solution: `$(SolutionDir).tools\linq2db.t4models`, it is used to store and link assemblies, needed for generation (linq2db.dll and data provider assemblies).
-
-To create a data model template take a look at one of the CopyMe.XXX.tt.txt file in your LinqToDB.Templates project folder. Copy this file to needed project location and rename it, like `MyModel.tt`
-
-There are few main steps in this file:
-
-1. Configuring generation process (read below)
-1. Loading metadata - this is a call to `LoadMatadata()` function - it connects to your database and fetches all needed metadata (table structure, views, and so on)
-1. Customizing generation process (read below)
-1. Calling `GenerateModel()` - this will run model generation 
-
-## Configuring schema load process
-
-Use the following initialization **before** you call the `LoadMetadata()` method.
-
-All schema load functionality configured using `GetSchemaOptions` property of [`LinqToDB.SchemaProvider.GetSchemaOptions`](https://github.com/linq2db/linq2db/blob/master/Source/LinqToDB/SchemaProvider/GetSchemaOptions.cs) type. Check this class for all available options.
-
-All loaded schema information is used for mappings generation, so if you want to limit generated mappings, it is the best place to do it.
-
-```cs
-// Enables loading of tables and views information
-GetSchemaOptions.GetTables             = true;
-// Enables loading of functions and procedures information
-GetSchemaOptions.GetProcedures         = true;
-// Enables use of System.Char type in generated model for text types
-// with length 1 instead of System.String
-GetSchemaOptions.GenerateChar1AsString = false;
-
-// (string[]) List of schemas to select.
-// Option applied only if is is not empty
-GetSchemaOptions.IncludedSchemas = null;
-// (string[]) List of schemas to exclude from select.
-// Option applied only if is is not empty
-GetSchemaOptions.ExcludedSchemas = null;
-
-// Option makes sense only for providers that return schema for several databases
-// (string[]) List of databases/catalogs to select.
-// Option applied only if is is not empty
-GetSchemaOptions.IncludedCatalogs = null;
-// Option makes sense only for providers that return schema for several databases
-// (string[]) List of databases/catalogs to exclude from select.
-// Option applied only if is is not empty
-GetSchemaOptions.ExcludedCatalogs = null;
-
-// Comparer, used for IncludedSchemas/ExcludedSchemas/IncludedCatalogs/ExcludedCatalogs lookups
-StringComparer                    = StringComparer.OrdinalIgnoreCase;
-
-// Custom filter for procedure/function result schema loader.
-// Can be used to exclude schema load for functions, that generate error during schema load
-// Also check GenerateProcedureErrors option below
-// ProcedureSchema type:
-// https://github.com/linq2db/linq2db/blob/master/Source/LinqToDB/SchemaProvider/ProcedureSchema.cs
-GetSchemaOptions.LoadProcedure     = (ProcedureSchema p) => true;
-
-// type: Func<ForeignKeySchema, string>
-// Defines custom association naming logic
-// https://github.com/linq2db/linq2db/blob/master/Source/LinqToDB/SchemaProvider/ForeignKeySchema.cs
-GetSchemaOptions.GetAssociationMemberName = null;
-
-// Procedures load progress reporting callback
-// Not applicable for T4 templates
-GetSchemaOptions.ProcedureLoadingProgress = (int total, int current) => {};
-```
-
-## Configuring generation process
-
-Use the following initialization **before** you call the `LoadMetadata()` method.
-
-```cs
-/* Global/generic options */
-// Namespace to use for generated model
-NamespaceName                  = "DataModels";
-
-/* Data context configuration */
-// (string) Name of base class for generated data context class.
-// Default: LinqToDB.Data.DataConnection.
-BaseDataContextClass           = null;
-// (string) Name of data context class.
-// Default: <DATABASE_NAME> + "DB"
-DataContextName                = null;
-// Enables generation of constructors for data context class.
-// Disabling could be usefull if you need to have custom implementation
-// of constructors in partial class
-GenerateConstructors          = true;               // Enforce generating DataContext constructors.
-// (string) Defines name of default configuration to use with default data context constructor
-DefaultConfiguration          = null;
-
-/* Schemas configuration */
-// Enables generation of mappings for each schema in separate type
-GenerateSchemaAsType            = false;
-// Contains mapping of schema name to corresponding schema class name
-// By default is empty and class name generated from schema name
-// Requires GenerateSchemaAsType=true set
-SchemaNameMapping               = Dictionary<string,string>();
-// Suffix, added to schema class name
-// Requires GenerateSchemaAsType=true set
-SchemaNameSuffix                = "Schema"
-// Name of data context class for schema.
-// Requires GenerateSchemaAsType=true set
-SchemaDataContextTypeName       = "DataContext"
-
-/* Table mappings configuration */
-// (string) Specify base class (or comma-separated list of class and/or interfaces) for table mappings
-BaseEntityClass               = null;
-// Enables generation of TableAttribute.Database property using database name, returned by schema loader
-GenerateDatabaseName          = false;
-// Enables generation of TableAttribute.Database property with provided name value.
-// (string) If set, overrides GenerateDatabaseName behavior
-DatabaseName                  = null;
-// Enables generation of TableAttribute.Schema property for default schema
-IncludeDefaultSchema          = true;
-// Enables generation of mappings for views
-GenerateViews                 = true;
-// Enables prefixing mapping classes for tables in non-default schema with schema name
-// E.g. MySchema.MyTable -> MySchema_MyTable
-// Applicable only if GenerateSchemaAsType = false
-PrefixTableMappingWithSchema  = true;
-
-/* Columns comfiguration */
-// Enables compact generation of column properties
-IsCompactColumns              = true;
-// Enables compact generation of aliased column properties
-IsCompactColumnAliases              = true;
-// Enables generation of DataType, Length, Precision and Scale properties of ColumnAttribute.
-// Could be overriden (except DataType) by options below
-GenerateDataTypes                   = false;
-// (boolean) Enables or disables generation of ColumnAttribute.Length property.
-// If null, GenerateDataTypes value is used
-GenerateLengthProperty              = null;
-// (boolean) Enables or disables generation of ColumnAttribute.Precision property.
-// If null, GenerateDataTypes value is used
-GeneratePrecisionProperty           = null;
-// (boolean) Enables or disables generation of ColumnAttribute.Scale property.
-// If null, GenerateDataTypes value is used
-GenerateScaleProperty               = null;
-// Enables generation of ColumnAttribute.DbType property.
-GenerateDbTypes                     = false;
-// Enables generation of ObsoleteAttribute for column aliases
-GenerateObsoleteAttributeForAliases = false;
-
-/* Associations configuration */
-// Defines type template for one-to-many association, when it is generated as a member of table mapping.
-// Some other options: "{0}[]", "List<{0}>".
-OneToManyAssociationType      = "IEnumerable<{0}>";
-// Enables generation of associations in table mappings
-GenerateAssociations          = true;
-// Enables generation of back side of association. Applies to both table mapping members and extension
-// associations
-GenerateBackReferences        = true;
-// Enables generation of associations as extension methods for related table mapping classes
-GenerateAssociationExtensions = false;
-// Defines method to generate name for "one" side of association
-Func<ForeignKey, string> GetAssociationExtensionSinglularName
-    = GetAssociationExtensionSinglularNameDefault;
-// Defines method to generate name for "many" side of association
-Func<ForeignKey, string> GetAssociationExtensionPluralName
-    = GetAssociationExtensionPluralNameDefault;
-
-/* Procedures and functions configuration */
-// Enables use of existing table mappings for procedures and functions that return same results as
-// defined by mapping
-ReplaceSimilarTables          = true;
-// If enabled, procedure schema load error will be generated as #error directive and fail build
-// of output file. Useful for initial generation to highlight places, that require review or
-// additional hints for schema loader
-// Also check GetSchemaOptions.LoadProcedure option above
-GenerateProcedureErrors       = true;
-// If enabled, methods for procedures that return table will be generated with List<T> return type and
-// IMPORTANT: this will lead to load of all procedure results into list and could lead
-// to performance issues on big results
-GenerateProcedureResultAsList = false;
-
-/* Other generated functionality */
-// Enables generation of Find(pk fields) extension methods for record selection by primary key value
-GenerateFindExtensions        = true;
-
-/* Pluralization services */
-// Enables pluralization of table mapping classes
-PluralizeClassNames                 = false;
-// Enables singularization of table mapping classes
-SingularizeClassNames               = true;
-// Enables pluralization of ITable<> properties in data context
-PluralizeDataContextPropertyNames   = true;
-// Enables singularization of ITable<> properties in data context
-SingularizeDataContextPropertyNames = false;
-
-/* Naming configuration */
-// Enables normalization of of type and member names.
-// Default normalization removes underscores and capitalize first letter.
-// Could be overriden using ToValidName option below.
-NormalizeNames                                 = false;
-// Defines logic to convert type/member name, derived from database object name, to C# identifier.
-Func<string, bool, string> ToValidName         = ToValidNameDefault;
-// Makes C# identifier valid by removing unsupported symbols and calling ToValidName
-Func<string, bool, string> ConvertToCompilable = ConvertToCompilableDefault;
-```
-
-## Provider specific options
-
-### SQL Server
-
-```cs
-// Enables generation of extensions for Free Text Search
-bool GenerateSqlServerFreeText = true;
-```
-
-### PostgreSQL
-
-```cs
-// Enables generation of case-sensitive names of database objects
-bool GenerateCaseSensitiveNames = false;
-```
-
-### Sybase
-
-```cs
-// Enables generation of Sybase sysobjects tables
-bool GenerateSybaseSystemTables = false;
-```
-
-## Example of generation process customization
-
-Use the following code to modify your model **before** you call the `GenerateModel()` method.
-
-```c#
-// Replaces table mapping class name
-GetTable("Person").TypeName  = "MyName";
-// Sets base class & interface for mapping class
-GetTable("Person").BaseClass = "PersonBase, IId";
-
-// Replaces property name for column PersonID of Person table with ID.
-GetColumn("Person", "PersonID")    .MemberName   = "ID";
-// Sets [Column(SkipOnUpdate=true)].
-// Same logic can be used for other column options
-GetColumn("Person", "PasswordHash").SkipOnUpdate = true;
-// Change column property type
-GetColumn("Person", "Gender")      .Type         = "global::Model.Gender";
-
-// Replaces association property name
-GetFK("Orders", "FK_Orders_Customers").MemberName      = "Customers";
-// Changes association type
-GetFK("Orders", "FK_Orders_Customers").AssociationType = AssociationType.OneToMany;
-
-SetTable(string tableName,
-	string TypeName = null,
-	string DataContextPropertyName = null)
-
-	.Column(string columnName, string MemberName = null, string Type = null, bool? IsNullable = null)
-	.FK    (string fkName,     string MemberName = null, AssociationType? AssociationType = null)
-	;
-
-// Adds extra namespace to usings
-Model.Usings.Add("MyNamespace");
-
-// Replaces all property names for columns where name is '<TableName>' + 'ID' with 'ID'.
-foreach (var t in Tables.Values)
-	foreach (var c in t.Columns.Values)
-		if (c.IsPrimaryKey && c.MemberName == t.TypeName + "ID")
-			c.MemberName = "ID";
-```
-
-## Useful members and data structures
-
-```c#
-Dictionary<string,Table>     Tables     = new Dictionary<string,Table>    ();
-Dictionary<string,Procedure> Procedures = new Dictionary<string,Procedure>();
-
-Table      GetTable     (string name);
-Procedure  GetProcedure (string name);
-Column     GetColumn    (string tableName, string columnName);
-ForeignKey GetFK        (string tableName, string fkName);
-ForeignKey GetForeignKey(string tableName, string fkName);
-
-public class Table
-{
-	public string Schema;
-	public string TableName;
-	public string DataContextPropertyName;
-	public bool   IsView;
-	public string Description;
-	public string AliasPropertyName;
-	public string AliasTypeName;
-	public string TypeName;
-
-	public Dictionary<string,Column>     Columns;
-	public Dictionary<string,ForeignKey> ForeignKeys;
-}
-
-public partial class Column : Property
-{
-	public string    ColumnName; // Column name in database
-	public bool      IsNullable;
-	public bool      IsIdentity;
-	public string    ColumnType; // Type of the column in database
-	public DbType    DbType;
-	public string    Description;
-	public bool      IsPrimaryKey;
-	public int       PrimaryKeyOrder;
-	public bool      SkipOnUpdate;
-	public bool      SkipOnInsert;
-	public bool      IsDuplicateOrEmpty;
-	public string    AliasName;
-	public string    MemberName;
-}
-
-public enum AssociationType
-{
-	Auto,
-	OneToOne,
-	OneToMany,
-	ManyToOne,
-}
-
-public partial class ForeignKey : Property
-{
-	public string           KeyName;
-	public Table            OtherTable;
-	public List<Column>     ThisColumns;
-	public List<Column>     OtherColumns;
-	public bool             CanBeNull;
-	public ForeignKey       BackReference;
-	public string           MemberName;
-	public AssociationType  AssociationType;
-}
-
-public partial class Procedure : Method
-{
-	public string          Schema;
-	public string          ProcedureName;
-	public bool            IsFunction;
-	public bool            IsTableFunction;
-	public bool            IsDefaultSchema;
-
-	public Table           ResultTable;
-	public Exception       ResultException;
-	public List<Table>     SimilarTables;
-	public List<Parameter> ProcParameters;
-}
-
-public class Parameter
-{
-	public string   SchemaName;
-	public string   SchemaType;
-	public bool     IsIn;
-	public bool     IsOut;
-	public bool     IsResult;
-	public int?     Size;
-	public string   ParameterName;
-	public string   ParameterType;
-	public Type     SystemType;
-	public string   DataType;
-}
-```
diff --git a/src/Version/LinqToDB.Templates/T4Model.ttinclude b/src/Version/LinqToDB.Templates/T4Model.ttinclude
deleted file mode 100644
index d164aaef9a42fd1d4ad0d5e12b738f916af133c9..0000000000000000000000000000000000000000
--- a/src/Version/LinqToDB.Templates/T4Model.ttinclude
+++ /dev/null
@@ -1,1564 +0,0 @@
-<#@ assembly name="System.Core"                   #>
-<#@ import namespace="System"                     #>
-<#@ import namespace="System.Collections.Generic" #>
-<#@ import namespace="System.Linq"                #>
-<#@ import namespace="System.Text"                #>
-<#+
-static Action<GeneratedTextTransformation,string> WriteComment    = (tt,s) => tt.WriteLine("//{0}", s);
-
-Action BeforeGenerateModel = () => {};
-
-bool GenerateProcedureErrors = true;
-
-void GenerateModel()
-{
-	Model.SetTree();
-
-	if (GenerationEnvironment.Length > 0 && GenerationEnvironment.ToString().Trim().Length == 0)
-		GenerationEnvironment.Length = 0;
-
-	WriteComment(this, "---------------------------------------------------------------------------------------------------");
-	WriteComment(this, " <auto-generated>");
-	WriteComment(this, "    This code was generated by T4Model template for T4 (https://github.com/linq2db/linq2db).");
-	WriteComment(this, "    Changes to this file may cause incorrect behavior and will be lost if the code is regenerated.");
-	WriteComment(this, " </auto-generated>");
-	WriteComment(this, "---------------------------------------------------------------------------------------------------");
-
-	WriteLine("");
-	WriteLine("#pragma warning disable 1591");
-	WriteLine("");
-	
-	BeforeGenerateModel();
-
-	Model.Render(this);
-
-	WriteLine("");
-	WriteLine("#pragma warning restore 1591");
-
-}
-
-void Trim()
-{
-	var arr = new[] { '\r', '\n', ' ' };
-	while (GenerationEnvironment.Length > 0 && arr.Contains(GenerationEnvironment[GenerationEnvironment.Length - 1]))
-		GenerationEnvironment.Length--;
-
-	WriteLine("");
-}
-
-static Action<GeneratedTextTransformation,string> WriteUsing = (tt,s) => tt.WriteLine("using {0};", s);
-
-void RenderUsings(List<string> usings)
-{
-	var q =
-		from ns in usings.Distinct()
-		group ns by ns.Split('.')[0];
-
-	var groups =
-		(from ns in q where ns.Key == "System"                select ns).Concat
-		(from ns in q where ns.Key != "System" orderby ns.Key select ns);
-
-	foreach (var gr in groups)
-	{
-		foreach (var ns in from s in gr orderby s select s)
-			WriteUsing(this, ns);
-
-		WriteLine("");
-	}
-
-	Trim();
-}
-
-// Base data types.
-//
-public interface ITree
-{
-	ITree              Parent { get; set; }
-	IEnumerable<ITree> GetNodes();
-	void               SetTree();
-}
-
-ModelSource Model = new ModelSource();
-
-public partial class ModelSource : ITree
-{
-	public int CurrentNamespace = 0;
-
-	public List<string>    Usings     = new List<String>    { "System"        };
-	public List<Namespace> Namespaces = new List<Namespace> { new Namespace() };
-
-	public Namespace      Namespace { get { return Namespaces[CurrentNamespace];       } }
-	public List<TypeBase> Types     { get { return Namespaces[CurrentNamespace].Types; } }
-
-	public virtual void Render(GeneratedTextTransformation tt)
-	{
-		tt.RenderUsings(Usings);
-		tt.WriteLine("");
-
-		foreach (var nm in Namespaces)
-		{
-			nm.Render(tt);
-			tt.WriteLine("");
-		}
-
-		tt.Trim();
-	}
-
-	public ITree              Parent     { get; set; }
-	public IEnumerable<ITree> GetNodes() { return Namespaces; }
-
-	public void SetTree()
-	{
-		foreach (var ch in GetNodes())
-		{
-			ch.Parent = this;
-			ch.SetTree();
-		}
-	}
-}
-
-static Action<GeneratedTextTransformation,string> WriteBeginNamespace = (tt,s) => { tt.WriteLine("namespace {0}", s); tt.WriteLine("{"); };
-static Action<GeneratedTextTransformation>        WriteEndNamespace   =  tt    => tt.WriteLine("}");
-
-public partial class Namespace : ITree
-{
-	public string         Name;
-	public List<TypeBase> Types  = new List<TypeBase>();
-	public List<string>   Usings = new List<string>();
-
-	public virtual void Render(GeneratedTextTransformation tt)
-	{
-		if (!string.IsNullOrEmpty(Name))
-		{
-			WriteBeginNamespace(tt, Name);
-			tt.PushIndent("\t");
-		}
-
-		tt.RenderUsings(Usings);
-
-		foreach (var t in Types)
-		{
-			t.Render(tt);
-			tt.WriteLine("");
-		}
-
-		tt.Trim();
-
-		if (!string.IsNullOrEmpty(Name))
-		{
-			tt.PopIndent();
-			WriteEndNamespace(tt);
-		}
-	}
-
-	public ITree              Parent     { get; set; }
-	public IEnumerable<ITree> GetNodes() { return Types; }
-
-	public void SetTree()
-	{
-		foreach (var ch in GetNodes())
-		{
-			ch.Parent = this;
-			ch.SetTree();
-		}
-	}
-}
-
-public interface IClassMember : ITree
-{
-}
-
-public enum AccessModifier
-{
-	Public,
-	Protected,
-	Internal,
-	Private,
-	Partial
-}
-
-public abstract partial class TypeBase : IClassMember
-{
-	public AccessModifier  AccessModifier = AccessModifier.Public;
-	public string          Name;
-	public bool            IsPartial  = true;
-	public List<string>    Comment    = new List<string>();
-	public List<Attribute> Attributes = new List<Attribute>();
-	public string          Conditional;
-
-	public abstract void Render(GeneratedTextTransformation tt);
-
-	protected virtual void BeginConditional(GeneratedTextTransformation tt)
-	{
-		if (Conditional != null)
-		{
-			tt.RemoveSpace();
-			tt.WriteLine("#if " + Conditional);
-			tt.WriteLine("");
-		}
-	}
-
-	protected virtual void EndConditional(GeneratedTextTransformation tt)
-	{
-		if (Conditional != null)
-		{
-			tt.RemoveSpace();
-			tt.WriteLine("");
-			tt.RemoveSpace();
-			tt.WriteLine("#endif");
-		}
-	}
-
-	public          ITree              Parent { get; set; }
-	public abstract IEnumerable<ITree> GetNodes();
-	public abstract void               SetTree ();
-}
-
-static Action<GeneratedTextTransformation,Class> WriteBeginClass = (tt,cl) =>
-{
-	tt.Write(cl.AccessModifier.ToString().ToLower() + " ");
-	if (cl.IsStatic)  tt.Write("static ");
-	if (cl.IsPartial) tt.Write("partial ", cl.Name);
-	tt.Write("class {0}{1}", cl.Name, cl.GenericArguments.Count > 0 ? $"<{string.Join(", ", cl.GenericArguments)}>" : string.Empty);
-
-	if (!string.IsNullOrEmpty(cl.BaseClass) || cl.Interfaces.Count > 0)
-	{
-		var arr = new[] { cl.BaseClass }.Concat(cl.Interfaces)
-			.Where(n => n != null)
-			.ToArray();
-
-		tt.Write(" : ");
-		tt.Write(string.Join(", ", arr));
-	}
-
-	tt.WriteLine("");
-	tt.WriteLine("{");
-};
-
-static Action<GeneratedTextTransformation> WriteEndClass = tt => tt.WriteLine("}");
-
-public partial class Class : TypeBase
-{
-	public string             BaseClass;
-	public List<string>       GenericArguments = new List<string>();
-	public bool               IsStatic         = false;
-	public List<string>       Interfaces       = new List<string>();
-	public List<IClassMember> Members          = new List<IClassMember>();
-
-	public Class()
-	{
-	}
-
-	public Class(string name, params IClassMember[] members)
-	{
-		Name = name;
-		Members.AddRange(members);
-	}
-
-	public override void Render(GeneratedTextTransformation tt)
-	{
-		BeginConditional(tt);
-
-		foreach (var c in Comment)
-			tt.WriteLine("//" + c);
-
-		if (Attributes.Count > 0)
-		{
-			var aa = Attributes.Where(a => !a.IsSeparated).ToList();
-
-			if (aa.Count > 0)
-			{
-				tt.Write("[");
-
-				for (var i = 0; i < aa.Count; i++)
-				{
-					if (i > 0) SkipSpacesAndInsert(tt, ", ");
-					aa[i].Render(tt);
-				}
-
-				tt.WriteLine("]");
-			}
-
-			aa = Attributes.Where(a => a.IsSeparated).ToList();
-
-			foreach (var a in aa)
-			{
-				tt.Write("[");
-				a.Render(tt);
-				tt.WriteLine("]");
-			}
-		}
-
-		WriteBeginClass(tt, this);
-		tt.PushIndent("\t");
-
-		foreach (var cm in Members)
-		{
-			if (cm is MemberBase)
-			{
-				var m = (MemberBase)cm;
-
-				if (!(m is MemberGroup))
-					m.BeginConditional(tt, false);
-
-				foreach (var c in m.Comment)
-					WriteComment(tt, c);
-
-				if (m.Attributes.Count > 0)
-				{
-					var q =
-						from a in m.Attributes
-						group a by a.Conditional ?? "";
-
-					foreach (var g in q)
-					{
-						if (g.Key.Length > 0)
-						{
-							tt.RemoveSpace();
-							tt.WriteLine("#if " + g.Key);
-						}
-
-						var attrs = g.ToList();
-
-						tt.Write("[");
-
-						for (var i = 0; i < attrs.Count; i++)
-						{
-							if (i > 0) SkipSpacesAndInsert(tt, ", ");
-							attrs[i].Render(tt);
-						}
-
-						tt.WriteLine("]");
-
-						if (g.Key.Length > 0)
-						{
-							tt.RemoveSpace();
-							tt.WriteLine("#endif");
-						}
-					}
-				}
-
-				m.Render(tt, false);
-				if (m.InsertBlankLineAfter)
-					tt.WriteLine("");
-
-				if (!(m is MemberGroup))
-					m.EndConditional(tt, false);
-			}
-			else if (cm is TypeBase)
-			{
-				var t = (TypeBase)cm;
-
-				t.Render(tt);
-				tt.WriteLine("");
-			}
-		}
-
-		tt.Trim();
-
-		tt.PopIndent();
-		WriteEndClass(tt);
-
-		EndConditional(tt);
-	}
-
-	public override IEnumerable<ITree> GetNodes()
-	{
-		return Members;
-	}
-
-	public override void SetTree()
-	{
-		foreach (var ch in GetNodes())
-		{
-			ch.Parent = this;
-			ch.SetTree();
-		}
-	}
-}
-
-public abstract partial class MemberBase : IClassMember
-{
-	public string          ID;
-	public AccessModifier  AccessModifier = AccessModifier.Public;
-	public string          Name;
-	public Func<string>    TypeBuilder;
-	public List<string>    Comment = new List<string>();
-	public string          EndLineComment;
-	public List<Attribute> Attributes = new List<Attribute>();
-	public bool            InsertBlankLineAfter = true;
-	public string          Conditional;
-
-	public int AccessModifierLen;
-	public int ModifierLen;
-	public int TypeLen;
-	public int NameLen;
-	public int ParamLen;
-	public int BodyLen;
-
-	public string Type
-	{
-		get { return TypeBuilder?.Invoke(); }
-		set { TypeBuilder = () => value;    }
-	}
-
-	public string BuildType() { return TypeBuilder?.Invoke(); }
-
-	public virtual  int  CalcModifierLen() { return 0; }
-	public abstract int  CalcBodyLen    ();
-	public virtual  int  CalcParamLen   () { return 0; }
-	public abstract void Render         (GeneratedTextTransformation tt, bool isCompact);
-
-	public virtual void BeginConditional(GeneratedTextTransformation tt, bool isCompact)
-	{
-		if (Conditional != null)
-		{
-			tt.RemoveSpace();
-			tt.WriteLine("#if " + Conditional);
-			if (!isCompact)
-				tt.WriteLine("");
-		}
-	}
-
-	public virtual void EndConditional(GeneratedTextTransformation tt, bool isCompact)
-	{
-		if (Conditional != null)
-		{
-			tt.RemoveSpace();
-			tt.WriteLine("#endif");
-			if (!isCompact)
-				tt.WriteLine("");
-		}
-	}
-
-	public         ITree              Parent     { get; set; }
-	public virtual IEnumerable<ITree> GetNodes() { return Enumerable.Empty<ITree>(); }
-	public virtual void               SetTree () {}
-}
-
-static Action<GeneratedTextTransformation,string> BeginRegion = (tt,s) => { tt.WriteLine("#region {0}", s); };
-static Action<GeneratedTextTransformation>        EndRegion   = (tt)   => { tt.WriteLine("#endregion");     };
-
-public partial class MemberGroup : MemberBase
-{
-	public string             Region;
-	public bool               IsCompact;
-	public bool               IsPropertyGroup;
-	public List<IClassMember> Members = new List<IClassMember>();
-	public List<string>       Errors  = new List<string>();
-
-	public override int  CalcBodyLen() { return 0; }
-
-	public override void Render(GeneratedTextTransformation tt, bool isCompact)
-	{
-		if (!string.IsNullOrEmpty(Region))
-		{
-			BeginRegion(tt, Region);
-			tt.WriteLine("");
-		}
-
-		BeginConditional(tt, isCompact);
-
-		if (Errors.Count > 0 && tt.GenerateProcedureErrors)
-		{
-			tt.RemoveSpace();
-			WriteComment(tt, " Use 'GenerateProcedureErrors=false' to disable errors.");
-			foreach (var error in Errors)
-			{
-				tt.Error(error);
-
-				foreach (var e in error.Split('\n'))
-				{
-					tt.RemoveSpace();
-					tt.WriteLine("#error " + e.Trim('\r'));
-				}
-			}
-
-			tt.WriteLine("");
-		}
-
-		if (IsCompact)
-		{
-			var allMembers = GetTreeNodes(this).OfType<MemberBase>().Where(m => !(m is MemberGroup)).ToList();
-
-			if (allMembers.Count > 0)
-			{
-				int max = allMembers.Max(m => m.AccessModifier.ToString().Length);
-				foreach (var m in allMembers)
-					m.AccessModifierLen = max;
-
-				max = allMembers.Max(m => m.CalcModifierLen());
-				foreach (var m in allMembers)
-					m.ModifierLen = max;
-
-				max = allMembers.Max(m => (m.BuildType() ?? "").Length);
-				foreach (var m in allMembers)
-					m.TypeLen = max;
-
-				var notHasGetter = allMembers.OfType<Property>().Any(m => m.IsAuto && !m.HasGetter);
-				var notHasSetter = allMembers.OfType<Property>().Any(m => m.IsAuto && !m.HasSetter);
-
-				foreach (var p in allMembers.OfType<Property>())
-				{
-					if (notHasGetter) p.GetterLen = 13;
-					if (notHasSetter) p.SetterLen = 13;
-				}
-
-				max = allMembers.Max(m => m.Name.Length);
-				foreach (var m in allMembers)
-					m.NameLen = max;
-
-				max = allMembers.Max(m => m.CalcParamLen());
-				foreach (var m in allMembers)
-					m.ParamLen = max;
-
-				max = allMembers.Max(m => m.CalcBodyLen());
-				foreach (var m in allMembers)
-					m.BodyLen = max;
-
-				var members =
-				(
-					from m in allMembers
-					select new
-					{
-						m,
-						attrs =
-						(
-							from a in m.Attributes
-							group a by a.Name into gr
-							select gr.Select((a,i) => new { a, name = a.Name + "." + i }).ToList() into s
-							from a in s
-							select a
-						).ToList()
-					}
-				).ToList();
-
-				var attrWeight =
-				(
-					from m in members
-					from a in m.attrs
-					group a by a.name into gr
-					select new { gr.Key, Count = gr.Count() }
-				).ToDictionary(a => a.Key, a => a.Count);
-
-				var q =
-					from m in members
-					where m.attrs.Count > 0
-					select new { m, w = m.attrs.Sum(aa => attrWeight[aa.name]) } into m
-					orderby m.w descending
-					select m.m;
-
-				var attrs = new List<string>();
-
-				foreach (var m in q)
-				{
-					var list = m.attrs.Select(a => a.name).ToList();
-
-					if (attrs.Count == 0)
-						attrs.AddRange(list);
-					else
-					{
-						for (var i = 0; i < list.Count; i++)
-						{
-							var nm = list[i];
-
-							if (!attrs.Contains(nm))
-							{
-								for (var j = i + 1; j < list.Count; j++)
-								{
-									var idx = attrs.IndexOf(list[j]);
-
-									if (idx >= 0)
-									{
-										attrs.Insert(idx, nm);
-										break;
-									}
-								}
-							}
-
-							if (!attrs.Contains(nm))
-								attrs.Add(nm);
-						}
-					}
-				}
-
-				var mms = members.Select(m =>
-				{
-					var arr = new Attribute[attrs.Count];
-
-					foreach (var a in m.attrs)
-						arr[attrs.IndexOf(a.name)] = a.a;
-
-					return new { m.m, attrs = arr.ToList() };
-				}).ToList();
-
-				var idxs = Enumerable.Range(0, attrs.Count).Select(_ => new List<int>()).ToList();
-
-				for (var i = 0; i < mms.Count; i++)
-					for (var j = 0; j < mms[i].attrs.Count; j++)
-						if (mms[i].attrs[j] != null)
-							idxs[j].Add(i);
-
-				var toRemove = new List<int>();
-
-				for (int i = 1; i < idxs.Count; i++)
-				{
-					for (int j = 0; j < i; j++)
-					{
-						if (idxs[j] == null)
-							continue;
-
-						if (idxs[i].Intersect(idxs[j]).Count() == 0)
-						{
-							foreach (var m in mms)
-							{
-								if (m.attrs[i] != null)
-								{
-									m.attrs[j] = m.attrs[i];
-									m.attrs[i] = null;
-								}
-							}
-
-							idxs[j].AddRange(idxs[i]);
-							idxs[i] = null;
-							toRemove.Add(i);
-							break;
-						}
-					}
-
-				}
-
-				foreach (var n in toRemove.OrderByDescending(i => i))
-					foreach (var m in mms)
-						m.attrs.RemoveAt(n);
-
-				var lens = new int[attrs.Count - toRemove.Count];
-
-				foreach (var m in mms)
-				{
-					for (var i = 0; i < m.attrs.Count; i++)
-					{
-						var a = m.attrs[i];
-
-						if (a != null)
-						{
-							var len = a.Name.Length;
-
-							if (a.Parameters.Count >= 0)
-								len += a.Parameters.Sum(p => 2 + p.Length);
-
-							lens[i] = Math.Max(lens[i], len);
-						}
-					}
-				}
-
-				foreach (var m in allMembers)
-				{
-					if (!(m is MemberGroup))
-						m.BeginConditional(tt, IsCompact);
-
-					foreach (var c in m.Comment)
-						WriteComment(tt, c);
-
-					if (attrs.Count > 0)
-					{
-						var ma = mms.First(mr => mr.m == m);
-
-						if (m.Attributes.Count > 0)
-						{
-							tt.Write("[");
-
-							for (var i = 0; i < ma.attrs.Count; i++)
-							{
-								var a = ma.attrs[i];
-
-								if (a == null)
-								{
-									tt.WriteSpaces(lens[i]);
-									if (i + 1 < ma.attrs.Count)
-										tt.Write("  ");
-								}
-								else
-								{
-									var len = tt.GenerationEnvironment.Length;
-									a.Render(tt);
-									len = (tt.GenerationEnvironment.Length - len);
-
-									var commaAdded = false;
-
-									for (var j = i + 1; j < ma.attrs.Count; j++)
-									{
-										if (ma.attrs[j] != null)
-										{
-											SkipSpacesAndInsert(tt, ", ");
-											commaAdded = true;
-											break;
-										}
-									}
-
-									if (i + 1 < ma.attrs.Count && !commaAdded)
-										tt.Write("  ");
-
-									tt.WriteSpaces(lens[i] - len);
-								}
-							}
-
-							tt.Write("] ");
-						}
-						else
-						{
-							tt.WriteSpaces(lens.Sum() + ma.attrs.Count * 2 + 1);
-						}
-					}
-
-					m.Render(tt, true);
-
-					if (!IsCompact)
-						tt.WriteLine("");
-
-					if (!(m is MemberGroup))
-						m.EndConditional(tt, IsCompact);
-				}
-			}
-		}
-		else
-		{
-			foreach (var cm in Members)
-			{
-				if (cm is MemberBase)
-				{
-					var m = (MemberBase)cm;
-
-					if (!(m is MemberGroup))
-						m.BeginConditional(tt, IsCompact);
-
-					foreach (var c in m.Comment)
-						WriteComment(tt, c);
-
-					if (m.Attributes.Count > 0)
-					{
-						var q =
-							from a in m.Attributes
-							group a by a.Conditional ?? "";
-
-						foreach (var g in q)
-						{
-							if (g.Key.Length > 0)
-							{
-								tt.RemoveSpace();
-								tt.WriteLine("#if " + g.Key);
-							}
-
-							var attrs = g.ToList();
-
-							var aa = attrs.Where(a => !a.IsSeparated).ToList();
-
-							if (aa.Count > 0)
-							{
-								tt.Write("[");
-
-								for (var i = 0; i < aa.Count; i++)
-								{
-									if (i > 0) tt.Write(", ");
-									aa[i].Render(tt);
-								}
-
-								tt.WriteLine("]");
-							}
-
-							aa = attrs.Where(a => a.IsSeparated).ToList();
-
-							foreach (var a in aa)
-							{
-								tt.Write("[");
-								a.Render(tt);
-								tt.WriteLine("]");
-							}
-
-							if (g.Key.Length > 0)
-							{
-								tt.RemoveSpace();
-								tt.WriteLine("#endif");
-							}
-						}
-					}
-
-					m.Render(tt, false);
-
-					if (m.InsertBlankLineAfter)
-						tt.WriteLine("");
-
-					if (!(m is MemberGroup))
-						m.EndConditional(tt, IsCompact);
-				}
-				else if (cm is TypeBase)
-				{
-					var t = (TypeBase)cm;
-
-					t.Render(tt);
-					tt.WriteLine("");
-				}
-			}
-		}
-
-		tt.Trim();
-
-		EndConditional(tt, isCompact);
-
-		if (!string.IsNullOrEmpty(Region))
-		{
-			tt.WriteLine("");
-			EndRegion(tt);
-		}
-	}
-
-	public override IEnumerable<ITree> GetNodes() { return Members; }
-
-	public override void SetTree()
-	{
-		foreach (var ch in GetNodes())
-		{
-			ch.Parent = this;
-			ch.SetTree();
-		}
-	}
-}
-
-static Action<GeneratedTextTransformation,Field> WriteField = (tt,f) =>
-{
-	var am = f.AccessModifier.ToString().ToLower();
-	var mdf =
-		(f.IsStatic   ? " static"   : "") +
-		(f.IsReadonly ? " readonly" : "") ;
-
-	tt.Write("{0}{1}{2}{3} {4}{5} {6}",
-		am,            LenDiff(f.AccessModifierLen, am),
-		mdf,           LenDiff(f.ModifierLen,       mdf),
-		f.BuildType(), LenDiff(f.TypeLen,           f.BuildType()),
-		f.Name);
-
-	if (f.InitValue != null)
-	{
-		tt.Write(" = {0}", f.InitValue);
-	}
-
-	tt.Write(";");
-
-	if (!string.IsNullOrEmpty(f.EndLineComment))
-	{
-		tt.WriteSpaces(f.NameLen - f.Name.Length + f.BodyLen + f.ParamLen - 1);
-		tt.Write(" ");
-		WriteComment(tt, " " + f.EndLineComment);
-	}
-	else
-		tt.WriteLine("");
-};
-
-public partial class Field : MemberBase
-{
-	public bool   IsStatic;
-	public bool   IsReadonly;
-	public string InitValue;
-
-	public Field()
-	{
-	}
-
-	public Field(Func<string> typeBuilder, string name)
-	{
-		TypeBuilder = typeBuilder;
-		Name = name;
-	}
-
-	public override int CalcModifierLen()
-	{
-		return
-			(IsStatic   ? " static".  Length : 0) +
-			(IsReadonly ? " readonly".Length : 0) ;
-	}
-
-	public override int  CalcBodyLen() { return InitValue == null ? 1 : 4 + InitValue.Length; }
-
-	public override void Render(GeneratedTextTransformation tt, bool isCompact)
-	{
-		WriteField(tt, this);
-	}
-}
-
-static Action<GeneratedTextTransformation,Event> WriteEvent = (tt,m) =>
-{
-	var am  = m.AccessModifier.ToString().ToLower();
-	var mdf =
-		(m.IsStatic  ? " static"  : "") +
-		(m.IsVirtual ? " virtual" : "") +
-		" event";
-
-	tt.Write("{0}{1}{2}{3} {4}{5} {6};",
-		am,            LenDiff(m.AccessModifierLen, am),
-		mdf,           LenDiff(m.ModifierLen,       mdf),
-		m.BuildType(), LenDiff(m.TypeLen,           m.BuildType()),
-		m.Name);
-
-	if (!string.IsNullOrEmpty(m.EndLineComment))
-	{
-		tt.WriteSpaces(m.NameLen - m.Name.Length + m.BodyLen + m.ParamLen - 1);
-		tt.Write(" ");
-		WriteComment(tt, " " + m.EndLineComment);
-	}
-	else
-		tt.WriteLine("");
-};
-
-public partial class Event : MemberBase
-{
-	public bool IsStatic;
-	public bool IsVirtual;
-
-	public Event()
-	{
-	}
-
-	public Event(Func<string> typeBuilder, string name)
-	{
-		TypeBuilder = typeBuilder;
-		Name = name;
-	}
-
-	public override int CalcModifierLen()
-	{
-		return
-			(IsStatic  ? " static". Length : 0) +
-			(IsVirtual ? " virtual".Length : 0) +
-			" event".Length;
-	}
-
-	public override int CalcBodyLen() { return 1; }
-
-	public override void Render(GeneratedTextTransformation tt, bool isCompact)
-	{
-		WriteEvent(tt, this);
-	}
-}
-
-static Action<GeneratedTextTransformation,Property,bool> WriteProperty = (tt,p,compact) =>
-{
-	var am  = p.AccessModifier.ToString().ToLower();
-//	var mdf = p.IsVirtual ? " virtual" : "";
-	var mdf = p.IsAbstract ? " abstract" : p.IsVirtual ? " virtual" : p.IsOverride ? " override" : p.IsStatic ? " static" : "";
-
-	tt.Write("{0}{1}{2}{3} {4}{5} {6}",
-		am,            LenDiff(p.AccessModifierLen, am),
-		mdf,           LenDiff(p.ModifierLen,       mdf),
-		p.BuildType(), LenDiff(p.TypeLen,           p.BuildType()),
-		p.Name);
-
-	Action writeComment = () =>
-	{
-		if (!string.IsNullOrEmpty(p.EndLineComment))
-		{
-			tt.Write(" ");
-			WriteComment(tt, " " + p.EndLineComment);
-		}
-		else
-			tt.WriteLine("");
-	};
-
-	if (p.IsAuto)
-	{
-		tt.Write(LenDiff(p.NameLen + p.ParamLen, p.Name));
-
-		var len = tt.GenerationEnvironment.Length;
-
-		tt.Write(" { ");
-
-		if (!p.HasGetter)
-			tt.Write("private ");
-		else if (p.GetterLen == 13)
-			tt.Write("        ");
-		tt.Write("get; ");
-
-		if (!p.HasSetter)
-			tt.Write("private ");
-		else if (p.SetterLen == 13)
-			tt.Write("        ");
-		tt.Write("set; ");
-
-		tt.Write("}");
-
-		if (!string.IsNullOrEmpty(p.EndLineComment))
-			tt.WriteSpaces(p.BodyLen - (tt.GenerationEnvironment.Length - len));
-		writeComment();
-	}
-	else
-	{
-		if (compact)
-		{
-			tt.Write(LenDiff(p.NameLen + p.ParamLen, p.Name));
-
-			var len = tt.GenerationEnvironment.Length;
-
-			tt.Write(" { ");
-
-			if (p.HasGetter)
-			{
-				tt.Write("get { ");
-				foreach (var t in p.BuildGetBody())
-					tt.Write("{0} ", t);
-				tt.Write("} ");
-			}
-
-			if (p.HasSetter)
-			{
-				tt.Write("set { ");
-				foreach (var t in p.BuildSetBody())
-					tt.Write("{0} ", t);
-				tt.Write("} ");
-			}
-
-			tt.Write("}");
-
-			if (!string.IsNullOrEmpty(p.EndLineComment))
-				tt.WriteSpaces(p.BodyLen - (tt.GenerationEnvironment.Length - len));
-			writeComment();
-		}
-		else
-		{
-			writeComment();
-
-			tt.WriteLine("{");
-			tt.PushIndent("\t");
-
-			if (p.HasGetter)
-			{
-				var getBody = p.BuildGetBody().ToArray();
-				if (getBody.Length == 1)
-				{
-					tt.WriteLine("get {{ {0} }}", getBody[0]);
-				}
-				else
-				{
-					tt.WriteLine("get");
-					tt.WriteLine("{");
-					tt.PushIndent("\t");
-
-					foreach (var t in getBody)
-						tt.WriteLine(t);
-
-					tt.PopIndent();
-					tt.WriteLine("}");
-				}
-			}
-
-			if (p.HasSetter)
-			{
-				var setBody = p.BuildSetBody().ToArray();
-				if (setBody.Length == 1)
-				{
-					tt.WriteLine("set {{ {0} }}", setBody[0]);
-				}
-				else
-				{
-					tt.WriteLine("set");
-					tt.WriteLine("{");
-					tt.PushIndent("\t");
-
-					foreach (var t in setBody)
-						tt.WriteLine(t);
-
-					tt.PopIndent();
-					tt.WriteLine("}");
-				}
-			}
-
-			tt.PopIndent();
-			tt.WriteLine("}");
-		}
-	}
-};
-
-public partial class Property : MemberBase
-{
-	public bool         IsAuto    = true;
-	public string       InitValue;
-	public bool         IsVirtual;
-	public bool         IsOverride;
-	public bool         IsAbstract;
-	public bool         IsStatic;
-	public bool         HasGetter = true;
-	public bool         HasSetter = true;
-	public List<Func<IEnumerable<string>>> GetBodyBuilders = new List<Func<IEnumerable<string>>>();
-	public List<Func<IEnumerable<string>>> SetBodyBuilders = new List<Func<IEnumerable<string>>>();
-
-	public int GetterLen = 5;
-	public int SetterLen = 5;
-
-	public Property()
-	{
-	}
-
-	public Property(Func<string> typeBuilder, string name, Func<IEnumerable<string>> getBodyBuilder = null, Func<IEnumerable<string>> setBodyBuilder = null)
-	{
-		TypeBuilder = typeBuilder;
-		Name = name;
-
-		InitBody(getBodyBuilder, setBodyBuilder);
-	}
-
-	public override int CalcModifierLen()
-	{
-		return IsVirtual ? " virtual".Length : 0;
-	}
-
-	public override int CalcBodyLen()
-	{
-		if (IsAuto)
-			return 4 + GetterLen + SetterLen; // ' { get; set; }'
-
-		var len = " {".Length;
-
-		if (HasGetter)
-		{
-			len += " get {".Length;
-			foreach (var t in BuildGetBody())
-				len += 1 + t.Length;
-			len += " }".Length;
-		}
-
-		if (HasSetter)
-		{
-			len += " set {".Length;
-			foreach (var t in BuildSetBody())
-				len += 1 + t.Length;
-			len += " }".Length;
-		}
-
-		len += " }".Length;
-
-		return len;
-	}
-
-	public override void Render(GeneratedTextTransformation tt, bool isCompact)
-	{
-		if (!IsAuto && HasGetter)
-		{
-			var getBody = BuildGetBody().ToArray();
-			if (getBody.Length == 1)
-			{
-				var t = getBody[0];
-
-				if (!t.StartsWith("return"))
-				{
-					t = "return " + t;
-
-					if (!t.EndsWith(";"))
-						t += ";";
-
-					GetBodyBuilders.Clear();
-					GetBodyBuilders.Add(() => new [] { t });
-				}
-			}
-		}
-
-		WriteProperty(tt, this, isCompact);
-	}
-
-	public Property InitBody(Func<IEnumerable<string>> getBodyBuilder = null, Func<IEnumerable<string>> setBodyBuilder = null)
-	{
-		IsAuto = getBodyBuilder == null && setBodyBuilder == null;
-
-		if (getBodyBuilder != null) GetBodyBuilders.Add(getBodyBuilder);
-		if (setBodyBuilder != null) SetBodyBuilders.Add(setBodyBuilder);
-
-		if (!IsAuto)
-		{
-			HasGetter = getBodyBuilder != null;
-			HasSetter = setBodyBuilder != null;
-		}
-
-		return this;
-	}
-
-	public Property InitGetter(Func<IEnumerable<string>> getBodyBuilder)
-	{
-		return InitBody(getBodyBuilder, null);
-	}
-
-	public IEnumerable<string> BuildGetBody()
-	{
-		return GetBodyBuilders.SelectMany(builder => builder?.Invoke() ?? Array.Empty<string>());
-	}
-
-	public IEnumerable<string> BuildSetBody()
-	{
-		return SetBodyBuilders.SelectMany(builder => builder?.Invoke() ?? Array.Empty<string>());
-	}
-}
-
-static Action<GeneratedTextTransformation,Method,bool> WriteMethod = (tt,m,compact) =>
-{
-	var am1  = m.AccessModifier.ToString().ToLower();
-	var len1 = m.AccessModifierLen;
-	var am2  = "";
-	var len2 = 0;
-	var mdf  = m.IsAbstract ? " abstract" : m.IsVirtual ? " virtual" : m.IsOverride ? " override" : m.IsStatic ? " static" : "";
-	var mlen = m.ModifierLen;
-
-	if (am1 == "partial" && mdf.Length > 0)
-	{
-		am2 = " " + am1; len2 = len1 + 1;
-		am1 = "";        len1 = 0;
-		mdf = mdf.Trim();
-		mlen--;
-	}
-
-	tt.Write("{0}{1}{2}{3}{4}{5}{6}{7}{8} {9}{10}",
-		am1,           LenDiff(len1, am1),
-		mdf,           LenDiff(mlen, mdf),
-		am2,           LenDiff(len2, am2),
-		m.BuildType() == null ? "" : " ",
-		m.BuildType(), LenDiff(m.TypeLen,     m.BuildType() ?? ""),
-		m.Name,
-		m.GenericArguments.Count > 0 ? $"<{string.Join(", ", m.GenericArguments)}>" : string.Empty);
-
-	Action writeComment = () =>
-	{
-		if (!string.IsNullOrEmpty(m.EndLineComment))
-		{
-			tt.Write(" ");
-			WriteComment(tt, " " + m.EndLineComment);
-		}
-		else
-			tt.WriteLine("");
-	};
-
-	Action writeParams = () =>
-	{
-		tt.Write("(");
-
-		for (int i = 0; i < m.ParameterBuilders.Count; i++)
-		{
-			if (i > 0)
-				tt.Write(", ");
-			tt.Write(m.ParameterBuilders[i]());
-		}
-
-		tt.Write(")");
-	};
-
-	if (compact)
-	{
-		tt.Write(LenDiff(m.NameLen, m.Name));
-
-		var len = tt.GenerationEnvironment.Length;
-
-		writeParams();
-
-		foreach (var s in m.AfterSignature)
-		{
-			tt.Write(" ");
-			tt.Write(s);
-		}
-
-		len = tt.GenerationEnvironment.Length - len;
-
-		if (m.IsAbstract || m.AccessModifier == AccessModifier.Partial)
-		{
-			tt.Write(";");
-			len = 0;
-		}
-		else
-		{
-			tt.WriteSpaces(m.ParamLen - len);
-
-			len = tt.GenerationEnvironment.Length;
-
-			tt.Write(" {");
-
-			foreach (var t in m.BuildBody())
-				tt.Write(" {0}", t);
-
-			tt.Write(" }");
-		}
-
-		if (!string.IsNullOrEmpty(m.EndLineComment))
-			tt.WriteSpaces(m.BodyLen - (tt.GenerationEnvironment.Length - len));
-		writeComment();
-	}
-	else
-	{
-		writeParams ();
-		writeComment();
-
-		tt.PushIndent("\t");
-		foreach (var s in m.AfterSignature)
-			tt.WriteLine(s);
-		tt.PopIndent();
-
-		tt.WriteLine("{");
-		tt.PushIndent("\t");
-
-		foreach (var t in m.BuildBody())
-		{
-			if (t.Length > 1 && t[0] == '#')
-			{
-				tt.RemoveSpace();
-			}
-
-			tt.WriteLine(t);
-		}
-
-		tt.PopIndent();
-		tt.WriteLine("}");
-	}
-};
-
-public partial class Method : MemberBase
-{
-	public bool         IsAbstract;
-	public bool         IsVirtual;
-	public bool         IsOverride;
-	public bool         IsStatic;
-	public List<string> GenericArguments        = new List<string>();
-	public List<string> AfterSignature          = new List<string>();
-	public List<Func<string>> ParameterBuilders = new List<Func<string>>();
-	public List<Func<IEnumerable<string>>> BodyBuilders = new List<Func<IEnumerable<string>>>();
-
-	public Method()
-	{
-	}
-
-	public Method(Func<string> typeBuilder, string name, IEnumerable<Func<string>> parameterBuilders = null, params Func<IEnumerable<string>>[] bodyBuilders)
-	{
-		TypeBuilder = typeBuilder;
-		Name = name;
-
-		if (parameterBuilders  != null) ParameterBuilders.AddRange(parameterBuilders);
-		if (bodyBuilders       != null) BodyBuilders.AddRange(bodyBuilders);
-	}
-
-	public static Method Create(string type, string name, IEnumerable<string> parameters = null, IEnumerable<string> body = null)
-	{
-		return new Method(
-			() => type,
-			name,
-			parameters?.Select<string,Func<string>>((string p) => () => p),
-			body?.Select<string,Func<IEnumerable<string>>>(p => () => new[] { p }).ToArray());
-	}
-
-	public IEnumerable<string> BuildBody()
-	{
-		return BodyBuilders.SelectMany(builder => builder?.Invoke() ?? Array.Empty<string>());
-	}
-
-	public override int CalcModifierLen()
-	{
-		return
-			IsAbstract ? " abstract".Length :
-			IsVirtual  ? " virtual".Length  :
-			IsStatic   ? " static".Length   : 0;
-	}
-
-	public override int CalcBodyLen()
-	{
-		if (IsAbstract || AccessModifier == AccessModifier.Partial)
-			return 1;
-
-		var len = " {".Length;
-
-		foreach (var t in BuildBody())
-			len += 1 + t.Length;
-
-		len += " }".Length;
-
-		return len;
-	}
-
-	public override int CalcParamLen()
-	{
-		return ParameterBuilders.Sum(p => p().Length + 2);
-	}
-
-	public override void Render(GeneratedTextTransformation tt, bool isCompact)
-	{
-		WriteMethod(tt, this, isCompact);
-	}
-}
-
-static Action<GeneratedTextTransformation,Attribute> WriteAttribute = (tt,a) =>
-{
-	tt.Write(a.Name);
-
-	if (a.Parameters.Count > 0)
-	{
-		tt.Write("(");
-
-		for (var i = 0; i < a.Parameters.Count; i++)
-		{
-			if (i > 0)
-				if (a.Parameters[i - 1].All(c => c == ' '))
-					tt.Write("  ");
-				else
-					SkipSpacesAndInsert(tt, ", ");
-			tt.Write(a.Parameters[i]);
-		}
-
-		SkipSpacesAndInsert(tt, ")");
-	}
-};
-
-public partial class Attribute
-{
-	public string       Name;
-	public List<string> Parameters = new List<string>();
-	public string       Conditional;
-	public bool         IsSeparated;
-
-	public Attribute()
-	{
-	}
-
-	public Attribute(string name, params string[] ps)
-	{
-		Name = name;
-		Parameters.AddRange(ps);
-	}
-
-	public virtual void Render(GeneratedTextTransformation tt)
-	{
-		WriteAttribute(tt, this);
-	}
-}
-
-// Helpers.
-//
-
-Func<string,string> ToPlural   = s => s + "s";
-Func<string,string> ToSingular = s => s;
-
-static string LenDiff(int max, string str)
-{
-	var s = "";
-
-	while (max-- > str.Length)
-		s += " ";
-
-	return s;
-}
-
-public void WriteSpaces(int len)
-{
-	while (len-- > 0)
-		Write(" ");
-}
-
-void RemoveSpace()
-{
-	Write(" ");
-
-	while (GenerationEnvironment.Length > 0 &&
-		(GenerationEnvironment[GenerationEnvironment.Length - 1] == ' ' ||
-		 GenerationEnvironment[GenerationEnvironment.Length - 1] == '\t'))
-		GenerationEnvironment.Length--;
-}
-
-public static IEnumerable<ITree> GetTreeNodes(ITree parent)
-{
-	foreach (var node in parent.GetNodes())
-	{
-		yield return node;
-
-		foreach (var grandNode in GetTreeNodes(node))
-			yield return grandNode;
-	}
-}
-
-public static ITree FindNode(ITree parent, Func<ITree,bool> func)
-{
-	foreach (var node in parent.GetNodes())
-	{
-		if (func(node))
-			return node;
-
-		var n = FindNode(node, func);
-
-		if (n != null)
-			return n;
-	}
-
-	return null;
-}
-
-static void SkipSpacesAndInsert(GeneratedTextTransformation tt, string value)
-{
-	var l = tt.GenerationEnvironment.Length;
-
-	for (; l > 0 && tt.GenerationEnvironment[l - 1] == ' '; l--)
-	{
-	}
-
-	tt.GenerationEnvironment.Insert(l, value);
-}
-
-
-string ToCamelCase(string name)
-{
-	var n = 0;
-
-	foreach (var c in name)
-	{
-		if (char.IsUpper(c))
-			n++;
-		else
-			break;
-	}
-
-	if (n == 0)
-		return name;
-
-	if (n == name.Length)
-		return name.ToLower();
-
-	n = Math.Max(1, n - 1);
-
-	return name.Substring(0, n).ToLower() + name.Substring(n);
-}
-
-event Action<Property,string,object> SetPropertyValueAction;
-
-void SetPropertyValue(Property propertyObject, string propertyName, object value)
-{
-	if (SetPropertyValueAction != null)
-		SetPropertyValueAction(propertyObject, propertyName, value);
-}
-
-static string ToStringLiteral(string value)
-{
-	if (value == null)
-		return "null";
-
-	var sb = new StringBuilder("\"");
-
-	foreach (var chr in value)
-	{
-		switch (chr)
-		{
-			case '\t':     sb.Append("\\t");            break;
-			case '\n':     sb.Append("\\n");            break;
-			case '\r':     sb.Append("\\r");            break;
-			case '\\':     sb.Append("\\\\");           break;
-			case '"' :     sb.Append("\\\"");           break;
-			case '\0':     sb.Append("\\0");            break;
-			case '\u0085':
-			case '\u2028':
-			case '\u2029':
-					 sb.Append($"\\u{(ushort)chr:X4}"); break;
-			default: sb.Append(chr);                    break;
-		}
-	}
-
-	sb.Append('"');
-
-	return sb.ToString();
-}
-
-#>
diff --git a/src/Version/LinqToDB.Templates/Validation.ttinclude b/src/Version/LinqToDB.Templates/Validation.ttinclude
deleted file mode 100644
index 45a7e84399626f034eb6674ddff2808f2d83a61c..0000000000000000000000000000000000000000
--- a/src/Version/LinqToDB.Templates/Validation.ttinclude
+++ /dev/null
@@ -1,189 +0,0 @@
-<#
-	{
-		var beforeGenerateModel = BeforeGenerateModel;
-		BeforeGenerateModel = () =>
-		{
-			beforeGenerateModel();
-			ValidationImpl();
-		};
-	}
-#>
-<#+
-void ValidationImpl()
-{
-	foreach (Class cl in GetTreeNodes(Model).OfType<Class>())
-	{
-		var validationGroup = new MemberGroup
-		{
-			Region = "Validation",
-		};
-
-		var props = GetTreeNodes(cl).OfType<Property>().Where(p => p.CustomValidation).ToList();
-
-		if (props.Count > 0)
-		{
-			if (!Model.Usings.Contains("System.Collections.Generic"))
-				Model.Usings.Add("System.Collections.Generic");
-
-			var isValid      = new Method(() => "bool", "IsValid", new Func<string>[] { () => cl.Name + " obj" }) { IsStatic = true };
-			var validator    = new Class("CustomValidator", isValid) { IsStatic = true, };
-			var partialGroup = new MemberGroup { IsCompact = true };
-
-			validationGroup.Members.Add(new Field(() => "int", "_isValidCounter") { Attributes = { new Attribute("field : NonSerialized") { Conditional = "!SILVERLIGHT" } } });
-			validationGroup.Members.Add(validator);
-			validationGroup.Members.Add(partialGroup);
-
-			isValid.BodyBuilders.Add(() => new []
-			{
-				"try",
-				"{",
-				"\tobj._isValidCounter++;",
-				""
-			});
-
-			var ret = "\treturn ";
-
-			for (var idx = 0; idx < props.Count; idx++)
-			{
-				var i = idx;
-				var p = props[i];
-
-				var name  = p.Name.Trim();
-				var mname = "Validate" + name;
-
-				cl.Attributes.Add(
-					new Attribute("CustomValidation",
-						"typeof(" + cl.Name + ".CustomValidator)",
-						ToStringLiteral(mname))
-						{
-							IsSeparated = true
-						});
-
-				isValid.BodyBuilders.Add(() => new [] {
-					"\tvar flag" + i + " = ValidationResult.Success == " + mname + "(obj, obj." + name + ");" });
-
-				ret += (i == 0 ? "" : " || ") + "flag" + i;
-
-				var validate = new Method(() => "ValidationResult", mname,
-					new Func<string>[] { () => cl.Name + " obj", () => p.BuildType().Trim() + " value" }) { IsStatic = true };
-
-				validate.BodyBuilders.Add(() => new []
-				{
-					"var list = new List<ValidationResult>();",
-					"",
-					"Validator.TryValidateProperty(",
-					"\tvalue,",
-					"\tnew ValidationContext(obj, null, null) { MemberName = NameOf" + name + " }, list);",
-					"",
-					"obj." + mname + "(value, list);",
-					"",
-					"if (list.Count > 0)",
-					"{",
-					"\tforeach (var result in list)",
-					"\t\tforeach (var name in result.MemberNames)",
-					"\t\t\tobj.AddError(name, result.ErrorMessage);",
-					"",
-					"\treturn list[0];",
-					"}",
-					"",
-					"obj.RemoveError(NameOf" + name + ");",
-					"",
-					"return ValidationResult.Success;"
-				});
-
-				validator.Members.Add(validate);
-
-				partialGroup.Members.Add(new Method(
-					() => "void",
-					mname,
-					new Func<string>[]
-					{
-						() => p.BuildType().Trim() + " value",
-						() => "List<ValidationResult> validationResults",
-					})
-					{
-						AccessModifier = AccessModifier.Partial,
-					});
-			}
-
-			isValid.BodyBuilders.Add(() => new []
-			{
-				"",
-				ret + ";",
-				"}",
-				"finally",
-				"{",
-				"\tobj._isValidCounter--;",
-				"}"
-			});
-		}
-
-		props = GetTreeNodes(cl).OfType<Property>().Where(p => p.ValidateProperty && p.HasSetter).ToList();
-
-		if (props.Count > 0)
-		{
-			foreach (var p in props)
-			{
-				var setBody = p.BuildSetBody().ToList();
-				if (setBody.Count > 0)
-					setBody.Insert(0, "");
-
-				setBody.Insert(0, "if (_validationLockCounter == 0)");
-				setBody.Insert(1, "{");
-
-				if (p.CustomValidation)
-				{
-					setBody.Insert(2, "\tvar validationResult = CustomValidator.Validate" + p.Name.Trim() + "(this, value);");
-					setBody.Insert(3, "\tif (validationResult != ValidationResult.Success)");
-					setBody.Insert(4, "\t\tthrow new ValidationException(validationResult, null, null);");
-					setBody.Insert(5, "}");
-				}
-				else
-				{
-					setBody.Insert(2, "\tValidator.ValidateProperty(");
-					setBody.Insert(3, "\t\tvalue,");
-					setBody.Insert(4, string.Format("\t\tnew ValidationContext(this, null, null) {{ MemberName = NameOf{0} }});", p.Name.Trim()));
-					setBody.Insert(5, "}");
-				}
-
-				p.SetBodyBuilders.Clear();
-				p.SetBodyBuilders.Add(() => setBody.ToArray());
-			}
-
-			validationGroup.Members.Add(new Field(() => "int", "_validationLockCounter")
-			{
-				AccessModifier = AccessModifier.Private,
-				InitValue      = "0",
-				Attributes     = { new Attribute("field : NonSerialized") { Conditional = "!SILVERLIGHT" } }
-			});
-
-			validationGroup.Members.Add(new Method (() => "void", "LockValidation",   null, () => new[] { "_validationLockCounter++;" }));
-			validationGroup.Members.Add(new Method (() => "void", "UnlockValidation", null, () => new[] { "_validationLockCounter--;" }));
-		}
-
-		if (validationGroup.Members.Count > 0)
-		{
-			if (!Model.Usings.Contains("System.ComponentModel.DataAnnotations"))
-				Model.Usings.Add("System.ComponentModel.DataAnnotations");
-
-			cl.Members.Add(validationGroup);
-			cl.SetTree();
-		}
-	}
-}
-
-partial class Property
-{
-	public bool CustomValidation;
-	public bool ValidateProperty;
-
-	public bool Validate
-	{
-		set
-		{
-			CustomValidation = value;
-			ValidateProperty = value;
-		}
-	}
-}
-#>
diff --git a/src/Version/NLog.config b/src/Version/NLog.config
deleted file mode 100644
index 7a0f3aa130d54048b05fae55068b588eafed2eac..0000000000000000000000000000000000000000
--- a/src/Version/NLog.config
+++ /dev/null
@@ -1,41 +0,0 @@
-<?xml version="1.0" encoding="utf-8" ?>
-<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
-      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-      xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd"
-      autoReload="true"
-      throwExceptions="false"
-      internalLogLevel="Off" internalLogFile="c:\temp\nlog-internal.log">
-
-  <!-- optional, add some variables
-  https://github.com/nlog/NLog/wiki/Configuration-file#variables
-  -->
-  <variable name="myvar" value="myvalue"/>
-
-  <!--
-  See https://github.com/nlog/nlog/wiki/Configuration-file
-  for information on customizing logging rules and outputs.
-   -->
-  <targets>
-
-    <!--
-    add your targets here
-    See https://github.com/nlog/NLog/wiki/Targets for possible targets.
-    See https://github.com/nlog/NLog/wiki/Layout-Renderers for the possible layout renderers.
-    -->
-
-    <!--
-    Write events to a file with the date in the filename.
-    <target xsi:type="File" name="f" fileName="${basedir}/logs/${shortdate}.log"
-            layout="${longdate} ${uppercase:${level}} ${message}" />
-    -->
-  </targets>
-
-  <rules>
-    <!-- add your logging rules here -->
-
-    <!--
-    Write all events with minimal level of Debug (So Debug, Info, Warn, Error and Fatal, but not Trace)  to "f"
-    <logger name="*" minlevel="Debug" writeTo="f" />
-    -->
-  </rules>
-</nlog>
diff --git a/src/Version/NLog.xsd b/src/Version/NLog.xsd
deleted file mode 100644
index 16d888c8a12847595252b8cd0a4a220397b9584f..0000000000000000000000000000000000000000
--- a/src/Version/NLog.xsd
+++ /dev/null
@@ -1,3556 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<xs:schema id="NLog" targetNamespace="http://www.nlog-project.org/schemas/NLog.xsd" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://www.nlog-project.org/schemas/NLog.xsd">
-  <xs:element name="nlog" type="NLogConfiguration" />
-  <xs:complexType name="NLogConfiguration">
-    <xs:choice minOccurs="0" maxOccurs="unbounded">
-      <xs:element name="extensions" type="NLogExtensions" />
-      <xs:element name="include" type="NLogInclude" />
-      <xs:element name="variable" type="NLogVariable" />
-      <xs:element name="targets" type="NLogTargets" />
-      <xs:element name="rules" type="NLogRules" />
-      <xs:element name="time" type="TimeSource" />
-    </xs:choice>
-    <xs:attribute name="autoReload" type="xs:boolean">
-      <xs:annotation>
-        <xs:documentation>Watch config file for changes and reload automatically.</xs:documentation>
-      </xs:annotation>
-    </xs:attribute>
-    <xs:attribute name="internalLogToConsole" type="xs:boolean">
-      <xs:annotation>
-        <xs:documentation>Print internal NLog messages to the console. Default value is: false</xs:documentation>
-      </xs:annotation>
-    </xs:attribute>
-    <xs:attribute name="internalLogToConsoleError" type="xs:boolean">
-      <xs:annotation>
-        <xs:documentation>Print internal NLog messages to the console error output. Default value is: false</xs:documentation>
-      </xs:annotation>
-    </xs:attribute>
-    <xs:attribute name="internalLogFile" type="xs:string">
-      <xs:annotation>
-        <xs:documentation>Write internal NLog messages to the specified file.</xs:documentation>
-      </xs:annotation>
-    </xs:attribute>
-    <xs:attribute name="internalLogLevel" type="NLogLevel">
-      <xs:annotation>
-        <xs:documentation>Log level threshold for internal log messages. Default value is: Info.</xs:documentation>
-      </xs:annotation>
-    </xs:attribute>
-    <xs:attribute name="globalThreshold" type="NLogLevel">
-      <xs:annotation>
-        <xs:documentation>Global log level threshold for application log messages. Messages below this level won't be logged.</xs:documentation>
-      </xs:annotation>
-    </xs:attribute>
-    <xs:attribute name="throwExceptions" type="xs:boolean">
-      <xs:annotation>
-        <xs:documentation>Throw an exception when there is an internal error. Default value is: false. Not recommend to set to true in production!</xs:documentation>
-      </xs:annotation>
-    </xs:attribute>
-    <xs:attribute name="throwConfigExceptions" type="xs:boolean">
-      <xs:annotation>
-        <xs:documentation>Throw an exception when there is a configuration error. If not set, determined by throwExceptions.</xs:documentation>
-      </xs:annotation>
-    </xs:attribute>
-    <xs:attribute name="keepVariablesOnReload" type="xs:boolean">
-      <xs:annotation>
-        <xs:documentation>Gets or sets a value indicating whether Variables should be kept on configuration reload. Default value is: false.</xs:documentation>
-      </xs:annotation>
-    </xs:attribute>
-    <xs:attribute name="internalLogToTrace" type="xs:boolean">
-      <xs:annotation>
-        <xs:documentation>Write internal NLog messages to the System.Diagnostics.Trace. Default value is: false.</xs:documentation>
-      </xs:annotation>
-    </xs:attribute>
-    <xs:attribute name="internalLogIncludeTimestamp" type="xs:boolean">
-      <xs:annotation>
-        <xs:documentation>Write timestamps for internal NLog messages. Default value is: true.</xs:documentation>
-      </xs:annotation>
-    </xs:attribute>
-    <xs:attribute name="useInvariantCulture" type="xs:boolean">
-      <xs:annotation>
-        <xs:documentation>Use InvariantCulture as default culture instead of CurrentCulture.  Default value is: false.</xs:documentation>
-      </xs:annotation>
-    </xs:attribute>
-    <xs:attribute name="parseMessageTemplates" type="xs:boolean">
-      <xs:annotation>
-        <xs:documentation>Perform message template parsing and formatting of LogEvent messages (true = Always, false = Never, empty = Auto Detect). Default value is: empty.</xs:documentation>
-      </xs:annotation>
-    </xs:attribute>
-  </xs:complexType>
-  <xs:complexType name="NLogTargets">
-    <xs:choice minOccurs="0" maxOccurs="unbounded">
-      <xs:element name="default-wrapper" type="WrapperTargetBase" />
-      <xs:element name="default-target-parameters" type="Target" />
-      <xs:element name="target" type="Target" />
-      <xs:element name="wrapper-target" type="WrapperTargetBase" />
-      <xs:element name="compound-target" type="CompoundTargetBase" />
-    </xs:choice>
-    <xs:attribute name="async" type="xs:boolean">
-      <xs:annotation>
-        <xs:documentation>Make all targets within this section asynchronous (creates additional threads but the calling thread isn't blocked by any target writes).</xs:documentation>
-      </xs:annotation>
-    </xs:attribute>
-  </xs:complexType>
-  <xs:complexType name="NLogRules">
-    <xs:sequence minOccurs="0" maxOccurs="unbounded">
-      <xs:element name="logger" type="NLogLoggerRule" />
-    </xs:sequence>
-  </xs:complexType>
-  <xs:complexType name="NLogExtensions">
-    <xs:choice minOccurs="0" maxOccurs="unbounded">
-      <xs:element name="add" type="NLogExtensionsAdd" />
-    </xs:choice>
-  </xs:complexType>
-  <xs:complexType name="NLogExtensionsAdd">
-    <xs:attribute name="prefix" type="xs:string">
-      <xs:annotation>
-        <xs:documentation>Prefix for targets/layout renderers/filters/conditions loaded from this assembly.</xs:documentation>
-      </xs:annotation>
-    </xs:attribute>
-    <xs:attribute name="assemblyFile" type="xs:string">
-      <xs:annotation>
-        <xs:documentation>Load NLog extensions from the specified file (*.dll)</xs:documentation>
-      </xs:annotation>
-    </xs:attribute>
-    <xs:attribute name="assembly" type="xs:string">
-      <xs:annotation>
-        <xs:documentation>Load NLog extensions from the specified assembly. Assembly name should be fully qualified.</xs:documentation>
-      </xs:annotation>
-    </xs:attribute>
-  </xs:complexType>
-  <xs:complexType name="NLogLoggerRule">
-    <xs:choice minOccurs="0" maxOccurs="unbounded">
-      <xs:element name="filters" type="NLogFilters" />
-    </xs:choice>
-    <xs:attribute name="name" use="optional">
-      <xs:annotation>
-        <xs:documentation>Name of the logger. May include  wildcard characters ('*' or '?').</xs:documentation>
-      </xs:annotation>
-    </xs:attribute>
-    <xs:attribute name="levels" type="NLogLevelList">
-      <xs:annotation>
-        <xs:documentation>Comma separated list of levels that this rule matches.</xs:documentation>
-      </xs:annotation>
-    </xs:attribute>
-    <xs:attribute name="minlevel" type="NLogLevel">
-      <xs:annotation>
-        <xs:documentation>Minimum level that this rule matches.</xs:documentation>
-      </xs:annotation>
-    </xs:attribute>
-    <xs:attribute name="maxlevel" type="NLogLevel">
-      <xs:annotation>
-        <xs:documentation>Maximum level that this rule matches.</xs:documentation>
-      </xs:annotation>
-    </xs:attribute>
-    <xs:attribute name="level" type="NLogLevel">
-      <xs:annotation>
-        <xs:documentation>Level that this rule matches.</xs:documentation>
-      </xs:annotation>
-    </xs:attribute>
-    <xs:attribute name="writeTo" type="NLogTargetIDList">
-      <xs:annotation>
-        <xs:documentation>Comma separated list of target names.</xs:documentation>
-      </xs:annotation>
-    </xs:attribute>
-    <xs:attribute name="final" type="xs:boolean" default="false">
-      <xs:annotation>
-        <xs:documentation>Ignore further rules if this one matches.</xs:documentation>
-      </xs:annotation>
-    </xs:attribute>
-    <xs:attribute name="ruleName" type="xs:string" use="optional">
-      <xs:annotation>
-        <xs:documentation>Rule identifier to allow rule lookup with Configuration.FindRuleByName and Configuration.RemoveRuleByName.</xs:documentation>
-      </xs:annotation>
-    </xs:attribute>
-  </xs:complexType>
-  <xs:complexType name="NLogFilters">
-    <xs:choice minOccurs="0" maxOccurs="unbounded">
-      <xs:element name="when" type="when" />
-      <xs:element name="whenContains" type="whenContains" />
-      <xs:element name="whenEqual" type="whenEqual" />
-      <xs:element name="whenNotContains" type="whenNotContains" />
-      <xs:element name="whenNotEqual" type="whenNotEqual" />
-      <xs:element name="whenRepeated" type="whenRepeated" />
-    </xs:choice>
-    <xs:attribute name="defaultAction" type="FilterResult">
-      <xs:annotation>
-        <xs:documentation>Default action if none of the filters match.</xs:documentation>
-      </xs:annotation>
-    </xs:attribute>
-  </xs:complexType>
-  <xs:simpleType name="NLogLevel">
-    <xs:restriction base="xs:string">
-      <xs:enumeration value="Off" />
-      <xs:enumeration value="Trace" />
-      <xs:enumeration value="Debug" />
-      <xs:enumeration value="Info" />
-      <xs:enumeration value="Warn" />
-      <xs:enumeration value="Error" />
-      <xs:enumeration value="Fatal" />
-    </xs:restriction>
-  </xs:simpleType>
-  <xs:simpleType name="LineEndingMode">
-    <xs:restriction base="xs:string">
-      <xs:enumeration value="Default" />
-      <xs:enumeration value="CRLF" />
-      <xs:enumeration value="CR" />
-      <xs:enumeration value="LF" />
-      <xs:enumeration value="None" />
-    </xs:restriction>
-  </xs:simpleType>
-  <xs:simpleType name="NLogLevelList">
-    <xs:restriction base="xs:string">
-      <xs:pattern value="(|Trace|Debug|Info|Warn|Error|Fatal)(,(Trace|Debug|Info|Warn|Error|Fatal))*" />
-    </xs:restriction>
-  </xs:simpleType>
-  <xs:complexType name="NLogInclude">
-    <xs:attribute name="file" type="SimpleLayoutAttribute" use="required">
-      <xs:annotation>
-        <xs:documentation>Name of the file to be included. You could use * wildcard. The name is relative to the name of the current config file.</xs:documentation>
-      </xs:annotation>
-    </xs:attribute>
-    <xs:attribute name="ignoreErrors" type="xs:boolean" use="optional" default="false">
-      <xs:annotation>
-        <xs:documentation>Ignore any errors in the include file.</xs:documentation>
-      </xs:annotation>
-    </xs:attribute>
-  </xs:complexType>
-  <xs:complexType name="NLogVariable">
-    <xs:choice minOccurs="0" maxOccurs="1">
-      <xs:element name="value" minOccurs="0" maxOccurs="1" type="xs:string">
-        <xs:annotation>
-          <xs:documentation>Variable value. Note, the 'value' attribute has precedence over this one.</xs:documentation>
-        </xs:annotation>
-      </xs:element>
-    </xs:choice>
-    <xs:attribute name="name" type="xs:string" use="required">
-      <xs:annotation>
-        <xs:documentation>Variable name.</xs:documentation>
-      </xs:annotation>
-    </xs:attribute>
-    <xs:attribute name="value" type="SimpleLayoutAttribute">
-      <xs:annotation>
-        <xs:documentation>Variable value.</xs:documentation>
-      </xs:annotation>
-    </xs:attribute>
-  </xs:complexType>
-  <xs:simpleType name="NLogTargetIDList">
-    <xs:restriction base="xs:string">
-      <xs:pattern value="(|([a-zA-Z][a-zA-Z0-9_\-]*))(,([a-zA-Z][a-zA-Z0-9_\-]*))*" />
-    </xs:restriction>
-  </xs:simpleType>
-  <xs:complexType name="Target" abstract="true"></xs:complexType>
-  <xs:complexType name="TargetRef">
-    <xs:attribute name="name" type="xs:string" use="required" />
-  </xs:complexType>
-  <xs:complexType name="WrapperTargetBase" abstract="true">
-    <xs:complexContent>
-      <xs:extension base="Target">
-        <xs:choice minOccurs="0" maxOccurs="unbounded">
-          <xs:element name="target" type="Target" minOccurs="1" maxOccurs="1" />
-          <xs:element name="wrapper-target" type="WrapperTargetBase" minOccurs="1" maxOccurs="1" />
-          <xs:element name="compound-target" type="CompoundTargetBase" minOccurs="1" maxOccurs="1" />
-          <xs:element name="target-ref" type="TargetRef" minOccurs="1" maxOccurs="1" />
-          <xs:element name="wrapper-target-ref" type="TargetRef" minOccurs="1" maxOccurs="1" />
-          <xs:element name="compound-target-ref" type="TargetRef" minOccurs="1" maxOccurs="1" />
-        </xs:choice>
-      </xs:extension>
-    </xs:complexContent>
-  </xs:complexType>
-  <xs:complexType name="CompoundTargetBase" abstract="true">
-    <xs:complexContent>
-      <xs:extension base="Target">
-        <xs:choice minOccurs="0" maxOccurs="unbounded">
-          <xs:element name="target" type="Target" minOccurs="1" maxOccurs="unbounded" />
-          <xs:element name="wrapper-target" type="WrapperTargetBase" minOccurs="1" maxOccurs="1" />
-          <xs:element name="compound-target" type="CompoundTargetBase" minOccurs="1" maxOccurs="1" />
-          <xs:element name="target-ref" type="TargetRef" minOccurs="1" maxOccurs="1" />
-          <xs:element name="wrapper-target-ref" type="TargetRef" minOccurs="1" maxOccurs="1" />
-          <xs:element name="compound-target-ref" type="TargetRef" minOccurs="1" maxOccurs="1" />
-        </xs:choice>
-      </xs:extension>
-    </xs:complexContent>
-  </xs:complexType>
-  <xs:complexType name="Filter" abstract="true"></xs:complexType>
-  <xs:complexType name="TimeSource" abstract="true"></xs:complexType>
-  <xs:simpleType name="SimpleLayoutAttribute">
-    <xs:restriction base="xs:string">
-      <xs:pattern value=".*" />
-    </xs:restriction>
-  </xs:simpleType>
-  <xs:simpleType name="Condition">
-    <xs:restriction base="xs:string">
-      <xs:minLength value="1" />
-    </xs:restriction>
-  </xs:simpleType>
-  <xs:complexType name="AsyncWrapper">
-    <xs:complexContent>
-      <xs:extension base="WrapperTargetBase">
-        <xs:choice minOccurs="0" maxOccurs="unbounded">
-          <xs:element name="name" minOccurs="0" maxOccurs="1" type="xs:string" />
-          <xs:element name="batchSize" minOccurs="0" maxOccurs="1" type="xs:integer" />
-          <xs:element name="forceLockingQueue" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-          <xs:element name="fullBatchSizeWriteLimit" minOccurs="0" maxOccurs="1" type="xs:integer" />
-          <xs:element name="overflowAction" minOccurs="0" maxOccurs="1" type="NLog.Targets.Wrappers.AsyncTargetWrapperOverflowAction" />
-          <xs:element name="queueLimit" minOccurs="0" maxOccurs="1" type="xs:integer" />
-          <xs:element name="timeToSleepBetweenBatches" minOccurs="0" maxOccurs="1" type="xs:integer" />
-          <xs:element name="optimizeBufferReuse" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-        </xs:choice>
-        <xs:attribute name="name" type="xs:string">
-          <xs:annotation>
-            <xs:documentation>Name of the target.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="batchSize" type="xs:integer">
-          <xs:annotation>
-            <xs:documentation>Number of log events that should be processed in a batch by the lazy writer thread.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="forceLockingQueue" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Whether to use the locking queue, instead of a lock-free concurrent queue The locking queue is less concurrent when many logger threads, but reduces memory allocation</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="fullBatchSizeWriteLimit" type="xs:integer">
-          <xs:annotation>
-            <xs:documentation>Limit of full s to write before yielding into  Performance is better when writing many small batches, than writing a single large batch</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="overflowAction" type="NLog.Targets.Wrappers.AsyncTargetWrapperOverflowAction">
-          <xs:annotation>
-            <xs:documentation>Action to be taken when the lazy writer thread request queue count exceeds the set limit.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="queueLimit" type="xs:integer">
-          <xs:annotation>
-            <xs:documentation>Limit on the number of requests in the lazy writer thread request queue.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="timeToSleepBetweenBatches" type="xs:integer">
-          <xs:annotation>
-            <xs:documentation>Time in milliseconds to sleep between batches. (1 or less means trigger on new activity)</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="optimizeBufferReuse" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-      </xs:extension>
-    </xs:complexContent>
-  </xs:complexType>
-  <xs:simpleType name="NLog.Targets.Wrappers.AsyncTargetWrapperOverflowAction">
-    <xs:restriction base="xs:string">
-      <xs:enumeration value="Grow" />
-      <xs:enumeration value="Discard" />
-      <xs:enumeration value="Block" />
-    </xs:restriction>
-  </xs:simpleType>
-  <xs:complexType name="AutoFlushWrapper">
-    <xs:complexContent>
-      <xs:extension base="WrapperTargetBase">
-        <xs:choice minOccurs="0" maxOccurs="unbounded">
-          <xs:element name="asyncFlush" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-          <xs:element name="condition" minOccurs="0" maxOccurs="1" type="Condition" />
-          <xs:element name="name" minOccurs="0" maxOccurs="1" type="xs:string" />
-          <xs:element name="flushOnConditionOnly" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-          <xs:element name="optimizeBufferReuse" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-        </xs:choice>
-        <xs:attribute name="asyncFlush" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Delay the flush until the LogEvent has been confirmed as written</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="condition" type="Condition">
-          <xs:annotation>
-            <xs:documentation>Condition expression. Log events who meet this condition will cause a flush on the wrapped target.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="name" type="xs:string">
-          <xs:annotation>
-            <xs:documentation>Name of the target.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="flushOnConditionOnly" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Only flush when LogEvent matches condition. Ignore explicit-flush, config-reload-flush and shutdown-flush</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="optimizeBufferReuse" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-      </xs:extension>
-    </xs:complexContent>
-  </xs:complexType>
-  <xs:complexType name="BufferingWrapper">
-    <xs:complexContent>
-      <xs:extension base="WrapperTargetBase">
-        <xs:choice minOccurs="0" maxOccurs="unbounded">
-          <xs:element name="name" minOccurs="0" maxOccurs="1" type="xs:string" />
-          <xs:element name="bufferSize" minOccurs="0" maxOccurs="1" type="xs:integer" />
-          <xs:element name="flushTimeout" minOccurs="0" maxOccurs="1" type="xs:integer" />
-          <xs:element name="overflowAction" minOccurs="0" maxOccurs="1" type="NLog.Targets.Wrappers.BufferingTargetWrapperOverflowAction" />
-          <xs:element name="slidingTimeout" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-          <xs:element name="optimizeBufferReuse" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-        </xs:choice>
-        <xs:attribute name="name" type="xs:string">
-          <xs:annotation>
-            <xs:documentation>Name of the target.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="bufferSize" type="xs:integer">
-          <xs:annotation>
-            <xs:documentation>Number of log events to be buffered.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="flushTimeout" type="xs:integer">
-          <xs:annotation>
-            <xs:documentation>Timeout (in milliseconds) after which the contents of buffer will be flushed if there's no write in the specified period of time. Use -1 to disable timed flushes.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="overflowAction" type="NLog.Targets.Wrappers.BufferingTargetWrapperOverflowAction">
-          <xs:annotation>
-            <xs:documentation>Action to take if the buffer overflows.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="slidingTimeout" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Indicates whether to use sliding timeout.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="optimizeBufferReuse" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-      </xs:extension>
-    </xs:complexContent>
-  </xs:complexType>
-  <xs:simpleType name="NLog.Targets.Wrappers.BufferingTargetWrapperOverflowAction">
-    <xs:restriction base="xs:string">
-      <xs:enumeration value="Flush" />
-      <xs:enumeration value="Discard" />
-    </xs:restriction>
-  </xs:simpleType>
-  <xs:complexType name="Chainsaw">
-    <xs:complexContent>
-      <xs:extension base="Target">
-        <xs:choice minOccurs="0" maxOccurs="unbounded">
-          <xs:element name="name" minOccurs="0" maxOccurs="1" type="xs:string" />
-          <xs:element name="encoding" minOccurs="0" maxOccurs="1" type="xs:string" />
-          <xs:element name="layout" minOccurs="0" maxOccurs="1" type="Layout" />
-          <xs:element name="lineEnding" minOccurs="0" maxOccurs="1" type="LineEndingMode" />
-          <xs:element name="maxMessageSize" minOccurs="0" maxOccurs="1" type="xs:integer" />
-          <xs:element name="newLine" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-          <xs:element name="address" minOccurs="0" maxOccurs="1" type="Layout" />
-          <xs:element name="connectionCacheSize" minOccurs="0" maxOccurs="1" type="xs:integer" />
-          <xs:element name="keepConnection" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-          <xs:element name="maxConnections" minOccurs="0" maxOccurs="1" type="xs:integer" />
-          <xs:element name="onConnectionOverflow" minOccurs="0" maxOccurs="1" type="NLog.Targets.NetworkTargetConnectionsOverflowAction" />
-          <xs:element name="onOverflow" minOccurs="0" maxOccurs="1" type="NLog.Targets.NetworkTargetOverflowAction" />
-          <xs:element name="sslProtocols" minOccurs="0" maxOccurs="1" type="System.Security.Authentication.SslProtocols" />
-          <xs:element name="maxQueueSize" minOccurs="0" maxOccurs="1" type="xs:integer" />
-          <xs:element name="keepAliveTimeSeconds" minOccurs="0" maxOccurs="1" type="xs:integer" />
-          <xs:element name="parameter" minOccurs="0" maxOccurs="unbounded" type="NLog.Targets.NLogViewerParameterInfo" />
-          <xs:element name="ndlcItemSeparator" minOccurs="0" maxOccurs="1" type="xs:string" />
-          <xs:element name="includeSourceInfo" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-          <xs:element name="loggerName" minOccurs="0" maxOccurs="1" type="Layout" />
-          <xs:element name="includeNLogData" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-          <xs:element name="includeNdlc" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-          <xs:element name="includeNdc" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-          <xs:element name="includeMdlc" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-          <xs:element name="includeMdc" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-          <xs:element name="includeCallSite" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-          <xs:element name="includeAllProperties" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-          <xs:element name="appInfo" minOccurs="0" maxOccurs="1" type="xs:string" />
-          <xs:element name="ndcItemSeparator" minOccurs="0" maxOccurs="1" type="xs:string" />
-          <xs:element name="optimizeBufferReuse" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-        </xs:choice>
-        <xs:attribute name="name" type="xs:string">
-          <xs:annotation>
-            <xs:documentation>Name of the target.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="encoding" type="xs:string">
-          <xs:annotation>
-            <xs:documentation>Encoding to be used.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="layout" type="SimpleLayoutAttribute">
-          <xs:annotation>
-            <xs:documentation>Instance of  that is used to format log messages.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="lineEnding" type="LineEndingMode">
-          <xs:annotation>
-            <xs:documentation>End of line value if a newline is appended at the end of log message .</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="maxMessageSize" type="xs:integer">
-          <xs:annotation>
-            <xs:documentation>Maximum message size in bytes.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="newLine" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Indicates whether to append newline at the end of log message.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="address" type="SimpleLayoutAttribute">
-          <xs:annotation>
-            <xs:documentation>Network address.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="connectionCacheSize" type="xs:integer">
-          <xs:annotation>
-            <xs:documentation>Size of the connection cache (number of connections which are kept alive).</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="keepConnection" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Indicates whether to keep connection open whenever possible.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="maxConnections" type="xs:integer">
-          <xs:annotation>
-            <xs:documentation>Maximum current connections. 0 = no maximum.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="onConnectionOverflow" type="NLog.Targets.NetworkTargetConnectionsOverflowAction">
-          <xs:annotation>
-            <xs:documentation>Action that should be taken if the will be more connections than .</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="onOverflow" type="NLog.Targets.NetworkTargetOverflowAction">
-          <xs:annotation>
-            <xs:documentation>Action that should be taken if the message is larger than maxMessageSize.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="sslProtocols" type="System.Security.Authentication.SslProtocols">
-          <xs:annotation>
-            <xs:documentation>Get or set the SSL/TLS protocols. Default no SSL/TLS is used. Currently only implemented for TCP.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="maxQueueSize" type="xs:integer">
-          <xs:annotation>
-            <xs:documentation>Maximum queue size.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="keepAliveTimeSeconds" type="xs:integer">
-          <xs:annotation>
-            <xs:documentation>The number of seconds a connection will remain idle before the first keep-alive probe is sent</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="ndlcItemSeparator" type="xs:string">
-          <xs:annotation>
-            <xs:documentation>NDLC item separator.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="includeSourceInfo" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Indicates whether to include source info (file name and line number) in the information sent over the network.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="loggerName" type="SimpleLayoutAttribute">
-          <xs:annotation>
-            <xs:documentation>Renderer for log4j:event logger-xml-attribute (Default ${logger})</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="includeNLogData" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Indicates whether to include NLog-specific extensions to log4j schema.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="includeNdlc" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Indicates whether to include contents of the  stack.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="includeNdc" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Indicates whether to include  stack contents.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="includeMdlc" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Indicates whether to include  dictionary contents.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="includeMdc" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Indicates whether to include  dictionary contents.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="includeCallSite" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Indicates whether to include call site (class and method name) in the information sent over the network.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="includeAllProperties" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Option to include all properties from the log events</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="appInfo" type="xs:string">
-          <xs:annotation>
-            <xs:documentation>AppInfo field. By default it's the friendly name of the current AppDomain.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="ndcItemSeparator" type="xs:string">
-          <xs:annotation>
-            <xs:documentation>NDC item separator.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="optimizeBufferReuse" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-      </xs:extension>
-    </xs:complexContent>
-  </xs:complexType>
-  <xs:simpleType name="NLog.Targets.NetworkTargetConnectionsOverflowAction">
-    <xs:restriction base="xs:string">
-      <xs:enumeration value="AllowNewConnnection" />
-      <xs:enumeration value="DiscardMessage" />
-      <xs:enumeration value="Block" />
-    </xs:restriction>
-  </xs:simpleType>
-  <xs:simpleType name="NLog.Targets.NetworkTargetOverflowAction">
-    <xs:restriction base="xs:string">
-      <xs:enumeration value="Error" />
-      <xs:enumeration value="Split" />
-      <xs:enumeration value="Discard" />
-    </xs:restriction>
-  </xs:simpleType>
-  <xs:simpleType name="System.Security.Authentication.SslProtocols">
-    <xs:restriction base="xs:string">
-      <xs:enumeration value="None" />
-      <xs:enumeration value="Ssl2" />
-      <xs:enumeration value="Ssl3" />
-      <xs:enumeration value="Tls" />
-      <xs:enumeration value="Tls11" />
-      <xs:enumeration value="Tls12" />
-      <xs:enumeration value="Tls13" />
-      <xs:enumeration value="Default" />
-    </xs:restriction>
-  </xs:simpleType>
-  <xs:complexType name="NLog.Targets.NLogViewerParameterInfo">
-    <xs:choice minOccurs="0" maxOccurs="unbounded">
-      <xs:element name="layout" minOccurs="0" maxOccurs="1" type="Layout" />
-      <xs:element name="name" minOccurs="0" maxOccurs="1" type="xs:string" />
-      <xs:element name="includeEmptyValue" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-    </xs:choice>
-    <xs:attribute name="layout" type="SimpleLayoutAttribute">
-      <xs:annotation>
-        <xs:documentation>Layout that should be use to calculate the value for the parameter.</xs:documentation>
-      </xs:annotation>
-    </xs:attribute>
-    <xs:attribute name="name" type="xs:string">
-      <xs:annotation>
-        <xs:documentation>Viewer parameter name.</xs:documentation>
-      </xs:annotation>
-    </xs:attribute>
-    <xs:attribute name="includeEmptyValue" type="xs:boolean">
-      <xs:annotation>
-        <xs:documentation>Whether an attribute with empty value should be included in the output</xs:documentation>
-      </xs:annotation>
-    </xs:attribute>
-  </xs:complexType>
-  <xs:complexType name="ColoredConsole">
-    <xs:complexContent>
-      <xs:extension base="Target">
-        <xs:choice minOccurs="0" maxOccurs="unbounded">
-          <xs:element name="name" minOccurs="0" maxOccurs="1" type="xs:string" />
-          <xs:element name="layout" minOccurs="0" maxOccurs="1" type="Layout" />
-          <xs:element name="header" minOccurs="0" maxOccurs="1" type="Layout" />
-          <xs:element name="footer" minOccurs="0" maxOccurs="1" type="Layout" />
-          <xs:element name="detectConsoleAvailable" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-          <xs:element name="enableAnsiOutput" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-          <xs:element name="encoding" minOccurs="0" maxOccurs="1" type="xs:string" />
-          <xs:element name="errorStream" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-          <xs:element name="detectOutputRedirected" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-          <xs:element name="useDefaultRowHighlightingRules" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-          <xs:element name="highlight-row" minOccurs="0" maxOccurs="unbounded" type="NLog.Targets.ConsoleRowHighlightingRule" />
-          <xs:element name="highlight-word" minOccurs="0" maxOccurs="unbounded" type="NLog.Targets.ConsoleWordHighlightingRule" />
-          <xs:element name="autoFlush" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-          <xs:element name="optimizeBufferReuse" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-        </xs:choice>
-        <xs:attribute name="name" type="xs:string">
-          <xs:annotation>
-            <xs:documentation>Name of the target.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="layout" type="SimpleLayoutAttribute">
-          <xs:annotation>
-            <xs:documentation>Text to be rendered.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="header" type="SimpleLayoutAttribute">
-          <xs:annotation>
-            <xs:documentation>Header.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="footer" type="SimpleLayoutAttribute">
-          <xs:annotation>
-            <xs:documentation>Footer.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="detectConsoleAvailable" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Indicates whether to auto-check if the console is available. - Disables console writing if Environment.UserInteractive = False (Windows Service) - Disables console writing if Console Standard Input is not available (Non-Console-App)</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="enableAnsiOutput" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Enables output using ANSI Color Codes</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="encoding" type="xs:string">
-          <xs:annotation>
-            <xs:documentation>The encoding for writing messages to the .</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="errorStream" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Indicates whether the error stream (stderr) should be used instead of the output stream (stdout).</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="detectOutputRedirected" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Indicates whether to auto-check if the console has been redirected to file - Disables coloring logic when System.Console.IsOutputRedirected = true</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="useDefaultRowHighlightingRules" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Indicates whether to use default row highlighting rules.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="autoFlush" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Indicates whether to auto-flush after </xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="optimizeBufferReuse" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-      </xs:extension>
-    </xs:complexContent>
-  </xs:complexType>
-  <xs:simpleType name="NLog.Targets.ConsoleOutputColor">
-    <xs:restriction base="xs:string">
-      <xs:enumeration value="Black" />
-      <xs:enumeration value="DarkBlue" />
-      <xs:enumeration value="DarkGreen" />
-      <xs:enumeration value="DarkCyan" />
-      <xs:enumeration value="DarkRed" />
-      <xs:enumeration value="DarkMagenta" />
-      <xs:enumeration value="DarkYellow" />
-      <xs:enumeration value="Gray" />
-      <xs:enumeration value="DarkGray" />
-      <xs:enumeration value="Blue" />
-      <xs:enumeration value="Green" />
-      <xs:enumeration value="Cyan" />
-      <xs:enumeration value="Red" />
-      <xs:enumeration value="Magenta" />
-      <xs:enumeration value="Yellow" />
-      <xs:enumeration value="White" />
-      <xs:enumeration value="NoChange" />
-    </xs:restriction>
-  </xs:simpleType>
-  <xs:complexType name="NLog.Targets.ConsoleRowHighlightingRule">
-    <xs:choice minOccurs="0" maxOccurs="unbounded">
-      <xs:element name="condition" minOccurs="0" maxOccurs="1" type="Condition" />
-      <xs:element name="backgroundColor" minOccurs="0" maxOccurs="1" type="NLog.Targets.ConsoleOutputColor" />
-      <xs:element name="foregroundColor" minOccurs="0" maxOccurs="1" type="NLog.Targets.ConsoleOutputColor" />
-    </xs:choice>
-    <xs:attribute name="condition" type="Condition">
-      <xs:annotation>
-        <xs:documentation>Condition that must be met in order to set the specified foreground and background color.</xs:documentation>
-      </xs:annotation>
-    </xs:attribute>
-    <xs:attribute name="backgroundColor" type="NLog.Targets.ConsoleOutputColor">
-      <xs:annotation>
-        <xs:documentation>Background color.</xs:documentation>
-      </xs:annotation>
-    </xs:attribute>
-    <xs:attribute name="foregroundColor" type="NLog.Targets.ConsoleOutputColor">
-      <xs:annotation>
-        <xs:documentation>Foreground color.</xs:documentation>
-      </xs:annotation>
-    </xs:attribute>
-  </xs:complexType>
-  <xs:complexType name="NLog.Targets.ConsoleWordHighlightingRule">
-    <xs:choice minOccurs="0" maxOccurs="unbounded">
-      <xs:element name="compileRegex" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-      <xs:element name="ignoreCase" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-      <xs:element name="regex" minOccurs="0" maxOccurs="1" type="xs:string" />
-      <xs:element name="text" minOccurs="0" maxOccurs="1" type="xs:string" />
-      <xs:element name="wholeWords" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-      <xs:element name="backgroundColor" minOccurs="0" maxOccurs="1" type="NLog.Targets.ConsoleOutputColor" />
-      <xs:element name="foregroundColor" minOccurs="0" maxOccurs="1" type="NLog.Targets.ConsoleOutputColor" />
-    </xs:choice>
-    <xs:attribute name="compileRegex" type="xs:boolean">
-      <xs:annotation>
-        <xs:documentation>Compile the ? This can improve the performance, but at the costs of more memory usage. If false, the Regex Cache is used.</xs:documentation>
-      </xs:annotation>
-    </xs:attribute>
-    <xs:attribute name="ignoreCase" type="xs:boolean">
-      <xs:annotation>
-        <xs:documentation>Indicates whether to ignore case when comparing texts.</xs:documentation>
-      </xs:annotation>
-    </xs:attribute>
-    <xs:attribute name="regex" type="xs:string">
-      <xs:annotation>
-        <xs:documentation>Regular expression to be matched. You must specify either text or regex.</xs:documentation>
-      </xs:annotation>
-    </xs:attribute>
-    <xs:attribute name="text" type="xs:string">
-      <xs:annotation>
-        <xs:documentation>Text to be matched. You must specify either text or regex.</xs:documentation>
-      </xs:annotation>
-    </xs:attribute>
-    <xs:attribute name="wholeWords" type="xs:boolean">
-      <xs:annotation>
-        <xs:documentation>Indicates whether to match whole words only.</xs:documentation>
-      </xs:annotation>
-    </xs:attribute>
-    <xs:attribute name="backgroundColor" type="NLog.Targets.ConsoleOutputColor">
-      <xs:annotation>
-        <xs:documentation>Background color.</xs:documentation>
-      </xs:annotation>
-    </xs:attribute>
-    <xs:attribute name="foregroundColor" type="NLog.Targets.ConsoleOutputColor">
-      <xs:annotation>
-        <xs:documentation>Foreground color.</xs:documentation>
-      </xs:annotation>
-    </xs:attribute>
-  </xs:complexType>
-  <xs:complexType name="Console">
-    <xs:complexContent>
-      <xs:extension base="Target">
-        <xs:choice minOccurs="0" maxOccurs="unbounded">
-          <xs:element name="name" minOccurs="0" maxOccurs="1" type="xs:string" />
-          <xs:element name="layout" minOccurs="0" maxOccurs="1" type="Layout" />
-          <xs:element name="header" minOccurs="0" maxOccurs="1" type="Layout" />
-          <xs:element name="footer" minOccurs="0" maxOccurs="1" type="Layout" />
-          <xs:element name="detectConsoleAvailable" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-          <xs:element name="encoding" minOccurs="0" maxOccurs="1" type="xs:string" />
-          <xs:element name="error" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-          <xs:element name="autoFlush" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-          <xs:element name="writeBuffer" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-          <xs:element name="optimizeBufferReuse" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-        </xs:choice>
-        <xs:attribute name="name" type="xs:string">
-          <xs:annotation>
-            <xs:documentation>Name of the target.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="layout" type="SimpleLayoutAttribute">
-          <xs:annotation>
-            <xs:documentation>Text to be rendered.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="header" type="SimpleLayoutAttribute">
-          <xs:annotation>
-            <xs:documentation>Header.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="footer" type="SimpleLayoutAttribute">
-          <xs:annotation>
-            <xs:documentation>Footer.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="detectConsoleAvailable" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Indicates whether to auto-check if the console is available - Disables console writing if Environment.UserInteractive = False (Windows Service) - Disables console writing if Console Standard Input is not available (Non-Console-App)</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="encoding" type="xs:string">
-          <xs:annotation>
-            <xs:documentation>The encoding for writing messages to the .</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="error" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Indicates whether to send the log messages to the standard error instead of the standard output.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="autoFlush" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Indicates whether to auto-flush after </xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="writeBuffer" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Whether to enable batch writing using char[]-buffers, instead of using </xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="optimizeBufferReuse" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-      </xs:extension>
-    </xs:complexContent>
-  </xs:complexType>
-  <xs:complexType name="Database">
-    <xs:complexContent>
-      <xs:extension base="Target">
-        <xs:choice minOccurs="0" maxOccurs="unbounded">
-          <xs:element name="name" minOccurs="0" maxOccurs="1" type="xs:string" />
-          <xs:element name="useTransactions" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-          <xs:element name="dbUserName" minOccurs="0" maxOccurs="1" type="Layout" />
-          <xs:element name="dbProvider" minOccurs="0" maxOccurs="1" type="xs:string" />
-          <xs:element name="dbPassword" minOccurs="0" maxOccurs="1" type="Layout" />
-          <xs:element name="keepConnection" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-          <xs:element name="dbDatabase" minOccurs="0" maxOccurs="1" type="Layout" />
-          <xs:element name="connectionStringName" minOccurs="0" maxOccurs="1" type="xs:string" />
-          <xs:element name="connectionString" minOccurs="0" maxOccurs="1" type="Layout" />
-          <xs:element name="dbHost" minOccurs="0" maxOccurs="1" type="Layout" />
-          <xs:element name="installConnectionString" minOccurs="0" maxOccurs="1" type="Layout" />
-          <xs:element name="install-command" minOccurs="0" maxOccurs="unbounded" type="NLog.Targets.DatabaseCommandInfo" />
-          <xs:element name="uninstall-command" minOccurs="0" maxOccurs="unbounded" type="NLog.Targets.DatabaseCommandInfo" />
-          <xs:element name="optimizeBufferReuse" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-          <xs:element name="parameter" minOccurs="0" maxOccurs="unbounded" type="NLog.Targets.DatabaseParameterInfo" />
-          <xs:element name="commandText" minOccurs="0" maxOccurs="1" type="Layout" />
-          <xs:element name="commandType" minOccurs="0" maxOccurs="1" type="System.Data.CommandType" />
-        </xs:choice>
-        <xs:attribute name="name" type="xs:string">
-          <xs:annotation>
-            <xs:documentation>Name of the target.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="useTransactions" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Obsolete - value will be ignored! The logging code always runs outside of transaction. Gets or sets a value indicating whether to use database transactions. Some data providers require this.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="dbUserName" type="SimpleLayoutAttribute">
-          <xs:annotation>
-            <xs:documentation>Database user name. If the ConnectionString is not provided this value will be used to construct the "User ID=" part of the connection string.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="dbProvider" type="xs:string">
-          <xs:annotation>
-            <xs:documentation>Name of the database provider.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="dbPassword" type="SimpleLayoutAttribute">
-          <xs:annotation>
-            <xs:documentation>Database password. If the ConnectionString is not provided this value will be used to construct the "Password=" part of the connection string.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="keepConnection" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Indicates whether to keep the database connection open between the log events.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="dbDatabase" type="SimpleLayoutAttribute">
-          <xs:annotation>
-            <xs:documentation>Database name. If the ConnectionString is not provided this value will be used to construct the "Database=" part of the connection string.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="connectionStringName" type="xs:string">
-          <xs:annotation>
-            <xs:documentation>Name of the connection string (as specified in &lt;connectionStrings&gt; configuration section.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="connectionString" type="SimpleLayoutAttribute">
-          <xs:annotation>
-            <xs:documentation>Connection string. When provided, it overrides the values specified in DBHost, DBUserName, DBPassword, DBDatabase.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="dbHost" type="SimpleLayoutAttribute">
-          <xs:annotation>
-            <xs:documentation>Database host name. If the ConnectionString is not provided this value will be used to construct the "Server=" part of the connection string.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="installConnectionString" type="SimpleLayoutAttribute">
-          <xs:annotation>
-            <xs:documentation>Connection string using for installation and uninstallation. If not provided, regular ConnectionString is being used.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="optimizeBufferReuse" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="commandText" type="SimpleLayoutAttribute">
-          <xs:annotation>
-            <xs:documentation>Text of the SQL command to be run on each log level.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="commandType" type="System.Data.CommandType">
-          <xs:annotation>
-            <xs:documentation>Type of the SQL command to be run on each log level.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-      </xs:extension>
-    </xs:complexContent>
-  </xs:complexType>
-  <xs:simpleType name="System.Data.CommandType">
-    <xs:restriction base="xs:string">
-      <xs:enumeration value="Text" />
-      <xs:enumeration value="StoredProcedure" />
-      <xs:enumeration value="TableDirect" />
-    </xs:restriction>
-  </xs:simpleType>
-  <xs:complexType name="NLog.Targets.DatabaseCommandInfo">
-    <xs:choice minOccurs="0" maxOccurs="unbounded">
-      <xs:element name="commandType" minOccurs="0" maxOccurs="1" type="System.Data.CommandType" />
-      <xs:element name="connectionString" minOccurs="0" maxOccurs="1" type="Layout" />
-      <xs:element name="ignoreFailures" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-      <xs:element name="parameter" minOccurs="0" maxOccurs="unbounded" type="NLog.Targets.DatabaseParameterInfo" />
-      <xs:element name="text" minOccurs="0" maxOccurs="1" type="Layout" />
-    </xs:choice>
-    <xs:attribute name="commandType" type="System.Data.CommandType">
-      <xs:annotation>
-        <xs:documentation>Type of the command.</xs:documentation>
-      </xs:annotation>
-    </xs:attribute>
-    <xs:attribute name="connectionString" type="SimpleLayoutAttribute">
-      <xs:annotation>
-        <xs:documentation>Connection string to run the command against. If not provided, connection string from the target is used.</xs:documentation>
-      </xs:annotation>
-    </xs:attribute>
-    <xs:attribute name="ignoreFailures" type="xs:boolean">
-      <xs:annotation>
-        <xs:documentation>Indicates whether to ignore failures.</xs:documentation>
-      </xs:annotation>
-    </xs:attribute>
-    <xs:attribute name="text" type="SimpleLayoutAttribute">
-      <xs:annotation>
-        <xs:documentation>Command text.</xs:documentation>
-      </xs:annotation>
-    </xs:attribute>
-  </xs:complexType>
-  <xs:complexType name="NLog.Targets.DatabaseParameterInfo">
-    <xs:choice minOccurs="0" maxOccurs="unbounded">
-      <xs:element name="name" minOccurs="0" maxOccurs="1" type="xs:string" />
-      <xs:element name="layout" minOccurs="0" maxOccurs="1" type="Layout" />
-      <xs:element name="dbType" minOccurs="0" maxOccurs="1" type="xs:string" />
-      <xs:element name="size" minOccurs="0" maxOccurs="1" type="xs:integer" />
-      <xs:element name="precision" minOccurs="0" maxOccurs="1" type="xs:byte" />
-      <xs:element name="scale" minOccurs="0" maxOccurs="1" type="xs:byte" />
-      <xs:element name="parameterType" minOccurs="0" maxOccurs="1" type="xs:string" />
-      <xs:element name="format" minOccurs="0" maxOccurs="1" type="xs:string" />
-      <xs:element name="culture" minOccurs="0" maxOccurs="1" type="xs:string" />
-    </xs:choice>
-    <xs:attribute name="name" type="xs:string">
-      <xs:annotation>
-        <xs:documentation>Database parameter name.</xs:documentation>
-      </xs:annotation>
-    </xs:attribute>
-    <xs:attribute name="layout" type="SimpleLayoutAttribute">
-      <xs:annotation>
-        <xs:documentation>Layout that should be use to calculate the value for the parameter.</xs:documentation>
-      </xs:annotation>
-    </xs:attribute>
-    <xs:attribute name="dbType" type="xs:string">
-      <xs:annotation>
-        <xs:documentation>Database parameter DbType.</xs:documentation>
-      </xs:annotation>
-    </xs:attribute>
-    <xs:attribute name="size" type="xs:integer">
-      <xs:annotation>
-        <xs:documentation>Database parameter size.</xs:documentation>
-      </xs:annotation>
-    </xs:attribute>
-    <xs:attribute name="precision" type="xs:byte">
-      <xs:annotation>
-        <xs:documentation>Database parameter precision.</xs:documentation>
-      </xs:annotation>
-    </xs:attribute>
-    <xs:attribute name="scale" type="xs:byte">
-      <xs:annotation>
-        <xs:documentation>Database parameter scale.</xs:documentation>
-      </xs:annotation>
-    </xs:attribute>
-    <xs:attribute name="parameterType" type="xs:string">
-      <xs:annotation>
-        <xs:documentation>Type of the parameter.</xs:documentation>
-      </xs:annotation>
-    </xs:attribute>
-    <xs:attribute name="format" type="xs:string">
-      <xs:annotation>
-        <xs:documentation>Convert format of the database parameter value .</xs:documentation>
-      </xs:annotation>
-    </xs:attribute>
-    <xs:attribute name="culture" type="xs:string">
-      <xs:annotation>
-        <xs:documentation>Culture used for parsing parameter string-value for type-conversion</xs:documentation>
-      </xs:annotation>
-    </xs:attribute>
-  </xs:complexType>
-  <xs:complexType name="Debugger">
-    <xs:complexContent>
-      <xs:extension base="Target">
-        <xs:choice minOccurs="0" maxOccurs="unbounded">
-          <xs:element name="name" minOccurs="0" maxOccurs="1" type="xs:string" />
-          <xs:element name="layout" minOccurs="0" maxOccurs="1" type="Layout" />
-          <xs:element name="header" minOccurs="0" maxOccurs="1" type="Layout" />
-          <xs:element name="footer" minOccurs="0" maxOccurs="1" type="Layout" />
-          <xs:element name="optimizeBufferReuse" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-        </xs:choice>
-        <xs:attribute name="name" type="xs:string">
-          <xs:annotation>
-            <xs:documentation>Name of the target.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="layout" type="SimpleLayoutAttribute">
-          <xs:annotation>
-            <xs:documentation>Text to be rendered.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="header" type="SimpleLayoutAttribute">
-          <xs:annotation>
-            <xs:documentation>Header.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="footer" type="SimpleLayoutAttribute">
-          <xs:annotation>
-            <xs:documentation>Footer.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="optimizeBufferReuse" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-      </xs:extension>
-    </xs:complexContent>
-  </xs:complexType>
-  <xs:complexType name="Debug">
-    <xs:complexContent>
-      <xs:extension base="Target">
-        <xs:choice minOccurs="0" maxOccurs="unbounded">
-          <xs:element name="name" minOccurs="0" maxOccurs="1" type="xs:string" />
-          <xs:element name="layout" minOccurs="0" maxOccurs="1" type="Layout" />
-          <xs:element name="optimizeBufferReuse" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-        </xs:choice>
-        <xs:attribute name="name" type="xs:string">
-          <xs:annotation>
-            <xs:documentation>Name of the target.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="layout" type="SimpleLayoutAttribute">
-          <xs:annotation>
-            <xs:documentation>Layout used to format log messages.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="optimizeBufferReuse" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-      </xs:extension>
-    </xs:complexContent>
-  </xs:complexType>
-  <xs:complexType name="EventLog">
-    <xs:complexContent>
-      <xs:extension base="Target">
-        <xs:choice minOccurs="0" maxOccurs="unbounded">
-          <xs:element name="name" minOccurs="0" maxOccurs="1" type="xs:string" />
-          <xs:element name="layout" minOccurs="0" maxOccurs="1" type="Layout" />
-          <xs:element name="category" minOccurs="0" maxOccurs="1" type="Layout" />
-          <xs:element name="entryType" minOccurs="0" maxOccurs="1" type="Layout" />
-          <xs:element name="eventId" minOccurs="0" maxOccurs="1" type="Layout" />
-          <xs:element name="log" minOccurs="0" maxOccurs="1" type="xs:string" />
-          <xs:element name="machineName" minOccurs="0" maxOccurs="1" type="xs:string" />
-          <xs:element name="maxKilobytes" minOccurs="0" maxOccurs="1" type="xs:long" />
-          <xs:element name="maxMessageLength" minOccurs="0" maxOccurs="1" type="xs:integer" />
-          <xs:element name="source" minOccurs="0" maxOccurs="1" type="Layout" />
-          <xs:element name="onOverflow" minOccurs="0" maxOccurs="1" type="NLog.Targets.EventLogTargetOverflowAction" />
-          <xs:element name="optimizeBufferReuse" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-        </xs:choice>
-        <xs:attribute name="name" type="xs:string">
-          <xs:annotation>
-            <xs:documentation>Name of the target.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="layout" type="SimpleLayoutAttribute">
-          <xs:annotation>
-            <xs:documentation>Layout used to format log messages.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="category" type="SimpleLayoutAttribute">
-          <xs:annotation>
-            <xs:documentation>Layout that renders event Category.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="entryType" type="SimpleLayoutAttribute">
-          <xs:annotation>
-            <xs:documentation>Optional entry type. When not set, or when not convertible to  then determined by </xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="eventId" type="SimpleLayoutAttribute">
-          <xs:annotation>
-            <xs:documentation>Layout that renders event ID.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="log" type="xs:string">
-          <xs:annotation>
-            <xs:documentation>Name of the Event Log to write to. This can be System, Application or any user-defined name.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="machineName" type="xs:string">
-          <xs:annotation>
-            <xs:documentation>Name of the machine on which Event Log service is running.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="maxKilobytes" type="xs:long">
-          <xs:annotation>
-            <xs:documentation>Maximum Event log size in kilobytes.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="maxMessageLength" type="xs:integer">
-          <xs:annotation>
-            <xs:documentation>Message length limit to write to the Event Log.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="source" type="SimpleLayoutAttribute">
-          <xs:annotation>
-            <xs:documentation>Value to be used as the event Source.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="onOverflow" type="NLog.Targets.EventLogTargetOverflowAction">
-          <xs:annotation>
-            <xs:documentation>Action to take if the message is larger than the  option.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="optimizeBufferReuse" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-      </xs:extension>
-    </xs:complexContent>
-  </xs:complexType>
-  <xs:simpleType name="NLog.Targets.EventLogTargetOverflowAction">
-    <xs:restriction base="xs:string">
-      <xs:enumeration value="Truncate" />
-      <xs:enumeration value="Split" />
-      <xs:enumeration value="Discard" />
-    </xs:restriction>
-  </xs:simpleType>
-  <xs:complexType name="FallbackGroup">
-    <xs:complexContent>
-      <xs:extension base="CompoundTargetBase">
-        <xs:choice minOccurs="0" maxOccurs="unbounded">
-          <xs:element name="name" minOccurs="0" maxOccurs="1" type="xs:string" />
-          <xs:element name="returnToFirstOnSuccess" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-          <xs:element name="optimizeBufferReuse" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-        </xs:choice>
-        <xs:attribute name="name" type="xs:string">
-          <xs:annotation>
-            <xs:documentation>Name of the target.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="returnToFirstOnSuccess" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Indicates whether to return to the first target after any successful write.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="optimizeBufferReuse" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-      </xs:extension>
-    </xs:complexContent>
-  </xs:complexType>
-  <xs:complexType name="File">
-    <xs:complexContent>
-      <xs:extension base="Target">
-        <xs:choice minOccurs="0" maxOccurs="unbounded">
-          <xs:element name="name" minOccurs="0" maxOccurs="1" type="xs:string" />
-          <xs:element name="layout" minOccurs="0" maxOccurs="1" type="Layout" />
-          <xs:element name="header" minOccurs="0" maxOccurs="1" type="Layout" />
-          <xs:element name="footer" minOccurs="0" maxOccurs="1" type="Layout" />
-          <xs:element name="encoding" minOccurs="0" maxOccurs="1" type="xs:string" />
-          <xs:element name="lineEnding" minOccurs="0" maxOccurs="1" type="LineEndingMode" />
-          <xs:element name="enableArchiveFileCompression" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-          <xs:element name="archiveNumbering" minOccurs="0" maxOccurs="1" type="NLog.Targets.ArchiveNumberingMode" />
-          <xs:element name="archiveFileName" minOccurs="0" maxOccurs="1" type="Layout" />
-          <xs:element name="archiveFileKind" minOccurs="0" maxOccurs="1" type="NLog.Targets.FilePathKind" />
-          <xs:element name="archiveEvery" minOccurs="0" maxOccurs="1" type="NLog.Targets.FileArchivePeriod" />
-          <xs:element name="archiveAboveSize" minOccurs="0" maxOccurs="1" type="xs:long" />
-          <xs:element name="maxArchiveFiles" minOccurs="0" maxOccurs="1" type="xs:integer" />
-          <xs:element name="writeFooterOnArchivingOnly" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-          <xs:element name="maxLogFilenames" minOccurs="0" maxOccurs="1" type="xs:integer" />
-          <xs:element name="fileNameKind" minOccurs="0" maxOccurs="1" type="NLog.Targets.FilePathKind" />
-          <xs:element name="forceManaged" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-          <xs:element name="forceMutexConcurrentWrites" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-          <xs:element name="replaceFileContentsOnEachWrite" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-          <xs:element name="writeBom" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-          <xs:element name="enableFileDelete" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-          <xs:element name="fileName" minOccurs="0" maxOccurs="1" type="Layout" />
-          <xs:element name="archiveDateFormat" minOccurs="0" maxOccurs="1" type="xs:string" />
-          <xs:element name="archiveOldFileOnStartup" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-          <xs:element name="cleanupFileName" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-          <xs:element name="createDirs" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-          <xs:element name="deleteOldFileOnStartup" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-          <xs:element name="fileAttributes" minOccurs="0" maxOccurs="1" type="NLog.Targets.Win32FileAttributes" />
-          <xs:element name="optimizeBufferReuse" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-          <xs:element name="networkWrites" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-          <xs:element name="openFileCacheTimeout" minOccurs="0" maxOccurs="1" type="xs:integer" />
-          <xs:element name="openFileCacheSize" minOccurs="0" maxOccurs="1" type="xs:integer" />
-          <xs:element name="keepFileOpen" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-          <xs:element name="discardAll" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-          <xs:element name="concurrentWrites" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-          <xs:element name="concurrentWriteAttempts" minOccurs="0" maxOccurs="1" type="xs:integer" />
-          <xs:element name="concurrentWriteAttemptDelay" minOccurs="0" maxOccurs="1" type="xs:integer" />
-          <xs:element name="bufferSize" minOccurs="0" maxOccurs="1" type="xs:integer" />
-          <xs:element name="openFileFlushTimeout" minOccurs="0" maxOccurs="1" type="xs:integer" />
-          <xs:element name="autoFlush" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-        </xs:choice>
-        <xs:attribute name="name" type="xs:string">
-          <xs:annotation>
-            <xs:documentation>Name of the target.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="layout" type="SimpleLayoutAttribute">
-          <xs:annotation>
-            <xs:documentation>Text to be rendered.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="header" type="SimpleLayoutAttribute">
-          <xs:annotation>
-            <xs:documentation>Header.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="footer" type="SimpleLayoutAttribute">
-          <xs:annotation>
-            <xs:documentation>Footer.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="encoding" type="xs:string">
-          <xs:annotation>
-            <xs:documentation>File encoding.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="lineEnding" type="LineEndingMode">
-          <xs:annotation>
-            <xs:documentation>Line ending mode.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="enableArchiveFileCompression" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Indicates whether to compress archive files into the zip archive format.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="archiveNumbering" type="NLog.Targets.ArchiveNumberingMode">
-          <xs:annotation>
-            <xs:documentation>Way file archives are numbered.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="archiveFileName" type="SimpleLayoutAttribute">
-          <xs:annotation>
-            <xs:documentation>Name of the file to be used for an archive.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="archiveFileKind" type="NLog.Targets.FilePathKind">
-          <xs:annotation>
-            <xs:documentation>Is the  an absolute or relative path?</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="archiveEvery" type="NLog.Targets.FileArchivePeriod">
-          <xs:annotation>
-            <xs:documentation>Indicates whether to automatically archive log files every time the specified time passes.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="archiveAboveSize" type="xs:long">
-          <xs:annotation>
-            <xs:documentation>Size in bytes above which log files will be automatically archived. Warning: combining this with  isn't supported. We cannot create multiple archive files, if they should have the same name. Choose: </xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="maxArchiveFiles" type="xs:integer">
-          <xs:annotation>
-            <xs:documentation>Maximum number of archive files that should be kept.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="writeFooterOnArchivingOnly" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Indicates whether the footer should be written only when the file is archived.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="maxLogFilenames" type="xs:integer">
-          <xs:annotation>
-            <xs:documentation>Maximum number of log file names that should be stored as existing.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="fileNameKind" type="NLog.Targets.FilePathKind">
-          <xs:annotation>
-            <xs:documentation>Is the  an absolute or relative path?</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="forceManaged" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Gets or set a value indicating whether a managed file stream is forced, instead of using the native implementation.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="forceMutexConcurrentWrites" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Indicates whether file creation calls should be synchronized by a system global mutex.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="replaceFileContentsOnEachWrite" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Indicates whether to replace file contents on each write instead of appending log message at the end.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="writeBom" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Indicates whether to write BOM (byte order mark) in created files</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="enableFileDelete" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Indicates whether to enable log file(s) to be deleted.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="fileName" type="SimpleLayoutAttribute">
-          <xs:annotation>
-            <xs:documentation>Name of the file to write to.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="archiveDateFormat" type="xs:string">
-          <xs:annotation>
-            <xs:documentation>Value specifying the date format to use when archiving files.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="archiveOldFileOnStartup" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Indicates whether to archive old log file on startup.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="cleanupFileName" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Cleanup invalid values in a filename, e.g. slashes in a filename. If set to true, this can impact the performance of massive writes. If set to false, nothing gets written when the filename is wrong.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="createDirs" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Indicates whether to create directories if they do not exist.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="deleteOldFileOnStartup" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Indicates whether to delete old log file on startup.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="fileAttributes" type="NLog.Targets.Win32FileAttributes">
-          <xs:annotation>
-            <xs:documentation>File attributes (Windows only).</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="optimizeBufferReuse" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="networkWrites" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Indicates whether concurrent writes to the log file by multiple processes on different network hosts.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="openFileCacheTimeout" type="xs:integer">
-          <xs:annotation>
-            <xs:documentation>Maximum number of seconds that files are kept open. If this number is negative the files are not automatically closed after a period of inactivity.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="openFileCacheSize" type="xs:integer">
-          <xs:annotation>
-            <xs:documentation>Number of files to be kept open. Setting this to a higher value may improve performance in a situation where a single File target is writing to many files (such as splitting by level or by logger).</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="keepFileOpen" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Indicates whether to keep log file open instead of opening and closing it on each logging event.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="discardAll" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Whether or not this target should just discard all data that its asked to write. Mostly used for when testing NLog Stack except final write</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="concurrentWrites" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Indicates whether concurrent writes to the log file by multiple processes on the same host.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="concurrentWriteAttempts" type="xs:integer">
-          <xs:annotation>
-            <xs:documentation>Number of times the write is appended on the file before NLog discards the log message.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="concurrentWriteAttemptDelay" type="xs:integer">
-          <xs:annotation>
-            <xs:documentation>Delay in milliseconds to wait before attempting to write to the file again.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="bufferSize" type="xs:integer">
-          <xs:annotation>
-            <xs:documentation>Log file buffer size in bytes.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="openFileFlushTimeout" type="xs:integer">
-          <xs:annotation>
-            <xs:documentation>Maximum number of seconds before open files are flushed. If this number is negative or zero the files are not flushed by timer.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="autoFlush" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Indicates whether to automatically flush the file buffers after each log message.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-      </xs:extension>
-    </xs:complexContent>
-  </xs:complexType>
-  <xs:simpleType name="NLog.Targets.ArchiveNumberingMode">
-    <xs:restriction base="xs:string">
-      <xs:enumeration value="Sequence" />
-      <xs:enumeration value="Rolling" />
-      <xs:enumeration value="Date" />
-      <xs:enumeration value="DateAndSequence" />
-    </xs:restriction>
-  </xs:simpleType>
-  <xs:simpleType name="NLog.Targets.FilePathKind">
-    <xs:restriction base="xs:string">
-      <xs:enumeration value="Unknown" />
-      <xs:enumeration value="Relative" />
-      <xs:enumeration value="Absolute" />
-    </xs:restriction>
-  </xs:simpleType>
-  <xs:simpleType name="NLog.Targets.FileArchivePeriod">
-    <xs:restriction base="xs:string">
-      <xs:enumeration value="None" />
-      <xs:enumeration value="Year" />
-      <xs:enumeration value="Month" />
-      <xs:enumeration value="Day" />
-      <xs:enumeration value="Hour" />
-      <xs:enumeration value="Minute" />
-      <xs:enumeration value="Sunday" />
-      <xs:enumeration value="Monday" />
-      <xs:enumeration value="Tuesday" />
-      <xs:enumeration value="Wednesday" />
-      <xs:enumeration value="Thursday" />
-      <xs:enumeration value="Friday" />
-      <xs:enumeration value="Saturday" />
-    </xs:restriction>
-  </xs:simpleType>
-  <xs:simpleType name="NLog.Targets.Win32FileAttributes">
-    <xs:restriction base="xs:string">
-      <xs:enumeration value="ReadOnly" />
-      <xs:enumeration value="Hidden" />
-      <xs:enumeration value="System" />
-      <xs:enumeration value="Archive" />
-      <xs:enumeration value="Device" />
-      <xs:enumeration value="Normal" />
-      <xs:enumeration value="Temporary" />
-      <xs:enumeration value="SparseFile" />
-      <xs:enumeration value="ReparsePoint" />
-      <xs:enumeration value="Compressed" />
-      <xs:enumeration value="NotContentIndexed" />
-      <xs:enumeration value="Encrypted" />
-      <xs:enumeration value="WriteThrough" />
-      <xs:enumeration value="NoBuffering" />
-      <xs:enumeration value="DeleteOnClose" />
-      <xs:enumeration value="PosixSemantics" />
-    </xs:restriction>
-  </xs:simpleType>
-  <xs:complexType name="FilteringWrapper">
-    <xs:complexContent>
-      <xs:extension base="WrapperTargetBase">
-        <xs:choice minOccurs="0" maxOccurs="unbounded">
-          <xs:element name="name" minOccurs="0" maxOccurs="1" type="xs:string" />
-          <xs:element name="condition" minOccurs="0" maxOccurs="1" type="Condition" />
-          <xs:element name="filter" minOccurs="0" maxOccurs="1" type="Filter" />
-          <xs:element name="optimizeBufferReuse" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-        </xs:choice>
-        <xs:attribute name="name" type="xs:string">
-          <xs:annotation>
-            <xs:documentation>Name of the target.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="condition" type="Condition">
-          <xs:annotation>
-            <xs:documentation>Condition expression. Log events who meet this condition will be forwarded to the wrapped target.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="optimizeBufferReuse" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-      </xs:extension>
-    </xs:complexContent>
-  </xs:complexType>
-  <xs:complexType name="ImpersonatingWrapper">
-    <xs:complexContent>
-      <xs:extension base="WrapperTargetBase">
-        <xs:choice minOccurs="0" maxOccurs="unbounded">
-          <xs:element name="name" minOccurs="0" maxOccurs="1" type="xs:string" />
-          <xs:element name="domain" minOccurs="0" maxOccurs="1" type="xs:string" />
-          <xs:element name="impersonationLevel" minOccurs="0" maxOccurs="1" type="NLog.Targets.Wrappers.SecurityImpersonationLevel" />
-          <xs:element name="logOnProvider" minOccurs="0" maxOccurs="1" type="NLog.Targets.Wrappers.LogOnProviderType" />
-          <xs:element name="logOnType" minOccurs="0" maxOccurs="1" type="NLog.Targets.Wrappers.SecurityLogOnType" />
-          <xs:element name="password" minOccurs="0" maxOccurs="1" type="xs:string" />
-          <xs:element name="revertToSelf" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-          <xs:element name="userName" minOccurs="0" maxOccurs="1" type="xs:string" />
-          <xs:element name="optimizeBufferReuse" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-        </xs:choice>
-        <xs:attribute name="name" type="xs:string">
-          <xs:annotation>
-            <xs:documentation>Name of the target.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="domain" type="xs:string">
-          <xs:annotation>
-            <xs:documentation>Windows domain name to change context to.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="impersonationLevel" type="NLog.Targets.Wrappers.SecurityImpersonationLevel">
-          <xs:annotation>
-            <xs:documentation>Required impersonation level.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="logOnProvider" type="NLog.Targets.Wrappers.LogOnProviderType">
-          <xs:annotation>
-            <xs:documentation>Type of the logon provider.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="logOnType" type="NLog.Targets.Wrappers.SecurityLogOnType">
-          <xs:annotation>
-            <xs:documentation>Logon Type.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="password" type="xs:string">
-          <xs:annotation>
-            <xs:documentation>User account password.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="revertToSelf" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Indicates whether to revert to the credentials of the process instead of impersonating another user.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="userName" type="xs:string">
-          <xs:annotation>
-            <xs:documentation>Username to change context to.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="optimizeBufferReuse" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-      </xs:extension>
-    </xs:complexContent>
-  </xs:complexType>
-  <xs:simpleType name="NLog.Targets.Wrappers.SecurityImpersonationLevel">
-    <xs:restriction base="xs:string">
-      <xs:enumeration value="Anonymous" />
-      <xs:enumeration value="Identification" />
-      <xs:enumeration value="Impersonation" />
-      <xs:enumeration value="Delegation" />
-    </xs:restriction>
-  </xs:simpleType>
-  <xs:simpleType name="NLog.Targets.Wrappers.LogOnProviderType">
-    <xs:restriction base="xs:string">
-      <xs:enumeration value="Default" />
-    </xs:restriction>
-  </xs:simpleType>
-  <xs:simpleType name="NLog.Targets.Wrappers.SecurityLogOnType">
-    <xs:restriction base="xs:string">
-      <xs:enumeration value="Interactive" />
-      <xs:enumeration value="Network" />
-      <xs:enumeration value="Batch" />
-      <xs:enumeration value="Service" />
-      <xs:enumeration value="NetworkClearText" />
-      <xs:enumeration value="NewCredentials" />
-    </xs:restriction>
-  </xs:simpleType>
-  <xs:complexType name="LimitingWrapper">
-    <xs:complexContent>
-      <xs:extension base="WrapperTargetBase">
-        <xs:choice minOccurs="0" maxOccurs="unbounded">
-          <xs:element name="interval" minOccurs="0" maxOccurs="1" type="xs:string" />
-          <xs:element name="messageLimit" minOccurs="0" maxOccurs="1" type="xs:integer" />
-          <xs:element name="name" minOccurs="0" maxOccurs="1" type="xs:string" />
-          <xs:element name="optimizeBufferReuse" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-        </xs:choice>
-        <xs:attribute name="interval" type="xs:string">
-          <xs:annotation>
-            <xs:documentation>Interval in which messages will be written up to the  number of messages.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="messageLimit" type="xs:integer">
-          <xs:annotation>
-            <xs:documentation>Maximum allowed number of messages written per .</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="name" type="xs:string">
-          <xs:annotation>
-            <xs:documentation>Name of the target.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="optimizeBufferReuse" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-      </xs:extension>
-    </xs:complexContent>
-  </xs:complexType>
-  <xs:complexType name="LogReceiverService">
-    <xs:complexContent>
-      <xs:extension base="Target">
-        <xs:choice minOccurs="0" maxOccurs="unbounded">
-          <xs:element name="name" minOccurs="0" maxOccurs="1" type="xs:string" />
-          <xs:element name="endpointAddress" minOccurs="0" maxOccurs="1" type="xs:string" />
-          <xs:element name="endpointConfigurationName" minOccurs="0" maxOccurs="1" type="xs:string" />
-          <xs:element name="useOneWayContract" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-          <xs:element name="clientId" minOccurs="0" maxOccurs="1" type="Layout" />
-          <xs:element name="includeEventProperties" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-          <xs:element name="parameter" minOccurs="0" maxOccurs="unbounded" type="NLog.Targets.MethodCallParameter" />
-          <xs:element name="useBinaryEncoding" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-          <xs:element name="optimizeBufferReuse" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-        </xs:choice>
-        <xs:attribute name="name" type="xs:string">
-          <xs:annotation>
-            <xs:documentation>Name of the target.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="endpointAddress" type="xs:string">
-          <xs:annotation>
-            <xs:documentation>Endpoint address.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="endpointConfigurationName" type="xs:string">
-          <xs:annotation>
-            <xs:documentation>Name of the endpoint configuration in WCF configuration file.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="useOneWayContract" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Indicates whether to use a WCF service contract that is one way (fire and forget) or two way (request-reply)</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="clientId" type="SimpleLayoutAttribute">
-          <xs:annotation>
-            <xs:documentation>Client ID.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="includeEventProperties" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Indicates whether to include per-event properties in the payload sent to the server.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="useBinaryEncoding" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Indicates whether to use binary message encoding.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="optimizeBufferReuse" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-      </xs:extension>
-    </xs:complexContent>
-  </xs:complexType>
-  <xs:complexType name="NLog.Targets.MethodCallParameter">
-    <xs:choice minOccurs="0" maxOccurs="unbounded">
-      <xs:element name="layout" minOccurs="0" maxOccurs="1" type="Layout" />
-      <xs:element name="name" minOccurs="0" maxOccurs="1" type="xs:string" />
-      <xs:element name="parameterType" minOccurs="0" maxOccurs="1" type="xs:string" />
-      <xs:element name="type" minOccurs="0" maxOccurs="1" type="xs:string" />
-    </xs:choice>
-    <xs:attribute name="layout" type="SimpleLayoutAttribute">
-      <xs:annotation>
-        <xs:documentation>Layout that should be use to calculate the value for the parameter.</xs:documentation>
-      </xs:annotation>
-    </xs:attribute>
-    <xs:attribute name="name" type="xs:string">
-      <xs:annotation>
-        <xs:documentation>Name of the parameter.</xs:documentation>
-      </xs:annotation>
-    </xs:attribute>
-    <xs:attribute name="parameterType" type="xs:string">
-      <xs:annotation>
-        <xs:documentation>Type of the parameter.</xs:documentation>
-      </xs:annotation>
-    </xs:attribute>
-    <xs:attribute name="type" type="xs:string">
-      <xs:annotation>
-        <xs:documentation>Type of the parameter. Obsolete alias for </xs:documentation>
-      </xs:annotation>
-    </xs:attribute>
-  </xs:complexType>
-  <xs:complexType name="Mail">
-    <xs:complexContent>
-      <xs:extension base="Target">
-        <xs:choice minOccurs="0" maxOccurs="unbounded">
-          <xs:element name="name" minOccurs="0" maxOccurs="1" type="xs:string" />
-          <xs:element name="layout" minOccurs="0" maxOccurs="1" type="Layout" />
-          <xs:element name="header" minOccurs="0" maxOccurs="1" type="Layout" />
-          <xs:element name="footer" minOccurs="0" maxOccurs="1" type="Layout" />
-          <xs:element name="replaceNewlineWithBrTagInHtml" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-          <xs:element name="priority" minOccurs="0" maxOccurs="1" type="Layout" />
-          <xs:element name="encoding" minOccurs="0" maxOccurs="1" type="xs:string" />
-          <xs:element name="bcc" minOccurs="0" maxOccurs="1" type="Layout" />
-          <xs:element name="cc" minOccurs="0" maxOccurs="1" type="Layout" />
-          <xs:element name="addNewLines" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-          <xs:element name="html" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-          <xs:element name="from" minOccurs="0" maxOccurs="1" type="Layout" />
-          <xs:element name="body" minOccurs="0" maxOccurs="1" type="Layout" />
-          <xs:element name="subject" minOccurs="0" maxOccurs="1" type="Layout" />
-          <xs:element name="to" minOccurs="0" maxOccurs="1" type="Layout" />
-          <xs:element name="optimizeBufferReuse" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-          <xs:element name="timeout" minOccurs="0" maxOccurs="1" type="xs:integer" />
-          <xs:element name="smtpServer" minOccurs="0" maxOccurs="1" type="Layout" />
-          <xs:element name="smtpAuthentication" minOccurs="0" maxOccurs="1" type="NLog.Targets.SmtpAuthenticationMode" />
-          <xs:element name="smtpUserName" minOccurs="0" maxOccurs="1" type="Layout" />
-          <xs:element name="smtpPassword" minOccurs="0" maxOccurs="1" type="Layout" />
-          <xs:element name="enableSsl" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-          <xs:element name="smtpPort" minOccurs="0" maxOccurs="1" type="xs:integer" />
-          <xs:element name="useSystemNetMailSettings" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-          <xs:element name="pickupDirectoryLocation" minOccurs="0" maxOccurs="1" type="xs:string" />
-          <xs:element name="deliveryMethod" minOccurs="0" maxOccurs="1" type="System.Net.Mail.SmtpDeliveryMethod" />
-        </xs:choice>
-        <xs:attribute name="name" type="xs:string">
-          <xs:annotation>
-            <xs:documentation>Name of the target.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="layout" type="SimpleLayoutAttribute">
-          <xs:annotation>
-            <xs:documentation>Text to be rendered.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="header" type="SimpleLayoutAttribute">
-          <xs:annotation>
-            <xs:documentation>Header.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="footer" type="SimpleLayoutAttribute">
-          <xs:annotation>
-            <xs:documentation>Footer.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="replaceNewlineWithBrTagInHtml" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Indicates whether NewLine characters in the body should be replaced with  tags.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="priority" type="SimpleLayoutAttribute">
-          <xs:annotation>
-            <xs:documentation>Priority used for sending mails.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="encoding" type="xs:string">
-          <xs:annotation>
-            <xs:documentation>Encoding to be used for sending e-mail.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="bcc" type="SimpleLayoutAttribute">
-          <xs:annotation>
-            <xs:documentation>BCC email addresses separated by semicolons (e.g. john@domain.com;jane@domain.com).</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="cc" type="SimpleLayoutAttribute">
-          <xs:annotation>
-            <xs:documentation>CC email addresses separated by semicolons (e.g. john@domain.com;jane@domain.com).</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="addNewLines" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Indicates whether to add new lines between log entries.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="html" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Indicates whether to send message as HTML instead of plain text.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="from" type="SimpleLayoutAttribute">
-          <xs:annotation>
-            <xs:documentation>Sender's email address (e.g. joe@domain.com).</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="body" type="SimpleLayoutAttribute">
-          <xs:annotation>
-            <xs:documentation>Mail message body (repeated for each log message send in one mail).</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="subject" type="SimpleLayoutAttribute">
-          <xs:annotation>
-            <xs:documentation>Mail subject.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="to" type="SimpleLayoutAttribute">
-          <xs:annotation>
-            <xs:documentation>Recipients' email addresses separated by semicolons (e.g. john@domain.com;jane@domain.com).</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="optimizeBufferReuse" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="timeout" type="xs:integer">
-          <xs:annotation>
-            <xs:documentation>Indicates the SMTP client timeout.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="smtpServer" type="SimpleLayoutAttribute">
-          <xs:annotation>
-            <xs:documentation>SMTP Server to be used for sending.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="smtpAuthentication" type="NLog.Targets.SmtpAuthenticationMode">
-          <xs:annotation>
-            <xs:documentation>SMTP Authentication mode.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="smtpUserName" type="SimpleLayoutAttribute">
-          <xs:annotation>
-            <xs:documentation>Username used to connect to SMTP server (used when SmtpAuthentication is set to "basic").</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="smtpPassword" type="SimpleLayoutAttribute">
-          <xs:annotation>
-            <xs:documentation>Password used to authenticate against SMTP server (used when SmtpAuthentication is set to "basic").</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="enableSsl" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Indicates whether SSL (secure sockets layer) should be used when communicating with SMTP server.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="smtpPort" type="xs:integer">
-          <xs:annotation>
-            <xs:documentation>Port number that SMTP Server is listening on.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="useSystemNetMailSettings" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Indicates whether the default Settings from System.Net.MailSettings should be used.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="pickupDirectoryLocation" type="xs:string">
-          <xs:annotation>
-            <xs:documentation>Folder where applications save mail messages to be processed by the local SMTP server.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="deliveryMethod" type="System.Net.Mail.SmtpDeliveryMethod">
-          <xs:annotation>
-            <xs:documentation>Specifies how outgoing email messages will be handled.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-      </xs:extension>
-    </xs:complexContent>
-  </xs:complexType>
-  <xs:simpleType name="NLog.Targets.SmtpAuthenticationMode">
-    <xs:restriction base="xs:string">
-      <xs:enumeration value="None" />
-      <xs:enumeration value="Basic" />
-      <xs:enumeration value="Ntlm" />
-    </xs:restriction>
-  </xs:simpleType>
-  <xs:simpleType name="System.Net.Mail.SmtpDeliveryMethod">
-    <xs:restriction base="xs:string">
-      <xs:enumeration value="Network" />
-      <xs:enumeration value="SpecifiedPickupDirectory" />
-      <xs:enumeration value="PickupDirectoryFromIis" />
-    </xs:restriction>
-  </xs:simpleType>
-  <xs:complexType name="Memory">
-    <xs:complexContent>
-      <xs:extension base="Target">
-        <xs:choice minOccurs="0" maxOccurs="unbounded">
-          <xs:element name="name" minOccurs="0" maxOccurs="1" type="xs:string" />
-          <xs:element name="layout" minOccurs="0" maxOccurs="1" type="Layout" />
-          <xs:element name="maxLogsCount" minOccurs="0" maxOccurs="1" type="xs:integer" />
-          <xs:element name="optimizeBufferReuse" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-        </xs:choice>
-        <xs:attribute name="name" type="xs:string">
-          <xs:annotation>
-            <xs:documentation>Name of the target.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="layout" type="SimpleLayoutAttribute">
-          <xs:annotation>
-            <xs:documentation>Layout used to format log messages.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="maxLogsCount" type="xs:integer">
-          <xs:annotation>
-            <xs:documentation>Max number of items to have in memory</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="optimizeBufferReuse" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-      </xs:extension>
-    </xs:complexContent>
-  </xs:complexType>
-  <xs:complexType name="MethodCall">
-    <xs:complexContent>
-      <xs:extension base="Target">
-        <xs:choice minOccurs="0" maxOccurs="unbounded">
-          <xs:element name="name" minOccurs="0" maxOccurs="1" type="xs:string" />
-          <xs:element name="className" minOccurs="0" maxOccurs="1" type="xs:string" />
-          <xs:element name="methodName" minOccurs="0" maxOccurs="1" type="xs:string" />
-          <xs:element name="parameter" minOccurs="0" maxOccurs="unbounded" type="NLog.Targets.MethodCallParameter" />
-          <xs:element name="optimizeBufferReuse" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-        </xs:choice>
-        <xs:attribute name="name" type="xs:string">
-          <xs:annotation>
-            <xs:documentation>Name of the target.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="className" type="xs:string">
-          <xs:annotation>
-            <xs:documentation>Class name.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="methodName" type="xs:string">
-          <xs:annotation>
-            <xs:documentation>Method name. The method must be public and static. Use the AssemblyQualifiedName , https://msdn.microsoft.com/en-us/library/system.type.assemblyqualifiedname(v=vs.110).aspx e.g.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="optimizeBufferReuse" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-      </xs:extension>
-    </xs:complexContent>
-  </xs:complexType>
-  <xs:complexType name="Network">
-    <xs:complexContent>
-      <xs:extension base="Target">
-        <xs:choice minOccurs="0" maxOccurs="unbounded">
-          <xs:element name="name" minOccurs="0" maxOccurs="1" type="xs:string" />
-          <xs:element name="layout" minOccurs="0" maxOccurs="1" type="Layout" />
-          <xs:element name="encoding" minOccurs="0" maxOccurs="1" type="xs:string" />
-          <xs:element name="lineEnding" minOccurs="0" maxOccurs="1" type="LineEndingMode" />
-          <xs:element name="maxMessageSize" minOccurs="0" maxOccurs="1" type="xs:integer" />
-          <xs:element name="newLine" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-          <xs:element name="address" minOccurs="0" maxOccurs="1" type="Layout" />
-          <xs:element name="connectionCacheSize" minOccurs="0" maxOccurs="1" type="xs:integer" />
-          <xs:element name="keepConnection" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-          <xs:element name="maxConnections" minOccurs="0" maxOccurs="1" type="xs:integer" />
-          <xs:element name="maxQueueSize" minOccurs="0" maxOccurs="1" type="xs:integer" />
-          <xs:element name="onConnectionOverflow" minOccurs="0" maxOccurs="1" type="NLog.Targets.NetworkTargetConnectionsOverflowAction" />
-          <xs:element name="onOverflow" minOccurs="0" maxOccurs="1" type="NLog.Targets.NetworkTargetOverflowAction" />
-          <xs:element name="sslProtocols" minOccurs="0" maxOccurs="1" type="System.Security.Authentication.SslProtocols" />
-          <xs:element name="keepAliveTimeSeconds" minOccurs="0" maxOccurs="1" type="xs:integer" />
-          <xs:element name="optimizeBufferReuse" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-        </xs:choice>
-        <xs:attribute name="name" type="xs:string">
-          <xs:annotation>
-            <xs:documentation>Name of the target.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="layout" type="SimpleLayoutAttribute">
-          <xs:annotation>
-            <xs:documentation>Layout used to format log messages.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="encoding" type="xs:string">
-          <xs:annotation>
-            <xs:documentation>Encoding to be used.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="lineEnding" type="LineEndingMode">
-          <xs:annotation>
-            <xs:documentation>End of line value if a newline is appended at the end of log message .</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="maxMessageSize" type="xs:integer">
-          <xs:annotation>
-            <xs:documentation>Maximum message size in bytes.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="newLine" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Indicates whether to append newline at the end of log message.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="address" type="SimpleLayoutAttribute">
-          <xs:annotation>
-            <xs:documentation>Network address.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="connectionCacheSize" type="xs:integer">
-          <xs:annotation>
-            <xs:documentation>Size of the connection cache (number of connections which are kept alive).</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="keepConnection" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Indicates whether to keep connection open whenever possible.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="maxConnections" type="xs:integer">
-          <xs:annotation>
-            <xs:documentation>Maximum current connections. 0 = no maximum.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="maxQueueSize" type="xs:integer">
-          <xs:annotation>
-            <xs:documentation>Maximum queue size.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="onConnectionOverflow" type="NLog.Targets.NetworkTargetConnectionsOverflowAction">
-          <xs:annotation>
-            <xs:documentation>Action that should be taken if the will be more connections than .</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="onOverflow" type="NLog.Targets.NetworkTargetOverflowAction">
-          <xs:annotation>
-            <xs:documentation>Action that should be taken if the message is larger than maxMessageSize.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="sslProtocols" type="System.Security.Authentication.SslProtocols">
-          <xs:annotation>
-            <xs:documentation>Get or set the SSL/TLS protocols. Default no SSL/TLS is used. Currently only implemented for TCP.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="keepAliveTimeSeconds" type="xs:integer">
-          <xs:annotation>
-            <xs:documentation>The number of seconds a connection will remain idle before the first keep-alive probe is sent</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="optimizeBufferReuse" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-      </xs:extension>
-    </xs:complexContent>
-  </xs:complexType>
-  <xs:complexType name="NLogViewer">
-    <xs:complexContent>
-      <xs:extension base="Target">
-        <xs:choice minOccurs="0" maxOccurs="unbounded">
-          <xs:element name="name" minOccurs="0" maxOccurs="1" type="xs:string" />
-          <xs:element name="encoding" minOccurs="0" maxOccurs="1" type="xs:string" />
-          <xs:element name="layout" minOccurs="0" maxOccurs="1" type="Layout" />
-          <xs:element name="lineEnding" minOccurs="0" maxOccurs="1" type="LineEndingMode" />
-          <xs:element name="maxMessageSize" minOccurs="0" maxOccurs="1" type="xs:integer" />
-          <xs:element name="newLine" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-          <xs:element name="address" minOccurs="0" maxOccurs="1" type="Layout" />
-          <xs:element name="connectionCacheSize" minOccurs="0" maxOccurs="1" type="xs:integer" />
-          <xs:element name="keepConnection" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-          <xs:element name="maxConnections" minOccurs="0" maxOccurs="1" type="xs:integer" />
-          <xs:element name="onConnectionOverflow" minOccurs="0" maxOccurs="1" type="NLog.Targets.NetworkTargetConnectionsOverflowAction" />
-          <xs:element name="onOverflow" minOccurs="0" maxOccurs="1" type="NLog.Targets.NetworkTargetOverflowAction" />
-          <xs:element name="sslProtocols" minOccurs="0" maxOccurs="1" type="System.Security.Authentication.SslProtocols" />
-          <xs:element name="maxQueueSize" minOccurs="0" maxOccurs="1" type="xs:integer" />
-          <xs:element name="keepAliveTimeSeconds" minOccurs="0" maxOccurs="1" type="xs:integer" />
-          <xs:element name="parameter" minOccurs="0" maxOccurs="unbounded" type="NLog.Targets.NLogViewerParameterInfo" />
-          <xs:element name="ndlcItemSeparator" minOccurs="0" maxOccurs="1" type="xs:string" />
-          <xs:element name="includeSourceInfo" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-          <xs:element name="loggerName" minOccurs="0" maxOccurs="1" type="Layout" />
-          <xs:element name="includeNLogData" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-          <xs:element name="includeNdlc" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-          <xs:element name="includeNdc" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-          <xs:element name="includeMdlc" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-          <xs:element name="includeMdc" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-          <xs:element name="includeCallSite" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-          <xs:element name="includeAllProperties" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-          <xs:element name="appInfo" minOccurs="0" maxOccurs="1" type="xs:string" />
-          <xs:element name="ndcItemSeparator" minOccurs="0" maxOccurs="1" type="xs:string" />
-          <xs:element name="optimizeBufferReuse" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-        </xs:choice>
-        <xs:attribute name="name" type="xs:string">
-          <xs:annotation>
-            <xs:documentation>Name of the target.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="encoding" type="xs:string">
-          <xs:annotation>
-            <xs:documentation>Encoding to be used.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="layout" type="SimpleLayoutAttribute">
-          <xs:annotation>
-            <xs:documentation>Instance of  that is used to format log messages.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="lineEnding" type="LineEndingMode">
-          <xs:annotation>
-            <xs:documentation>End of line value if a newline is appended at the end of log message .</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="maxMessageSize" type="xs:integer">
-          <xs:annotation>
-            <xs:documentation>Maximum message size in bytes.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="newLine" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Indicates whether to append newline at the end of log message.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="address" type="SimpleLayoutAttribute">
-          <xs:annotation>
-            <xs:documentation>Network address.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="connectionCacheSize" type="xs:integer">
-          <xs:annotation>
-            <xs:documentation>Size of the connection cache (number of connections which are kept alive).</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="keepConnection" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Indicates whether to keep connection open whenever possible.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="maxConnections" type="xs:integer">
-          <xs:annotation>
-            <xs:documentation>Maximum current connections. 0 = no maximum.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="onConnectionOverflow" type="NLog.Targets.NetworkTargetConnectionsOverflowAction">
-          <xs:annotation>
-            <xs:documentation>Action that should be taken if the will be more connections than .</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="onOverflow" type="NLog.Targets.NetworkTargetOverflowAction">
-          <xs:annotation>
-            <xs:documentation>Action that should be taken if the message is larger than maxMessageSize.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="sslProtocols" type="System.Security.Authentication.SslProtocols">
-          <xs:annotation>
-            <xs:documentation>Get or set the SSL/TLS protocols. Default no SSL/TLS is used. Currently only implemented for TCP.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="maxQueueSize" type="xs:integer">
-          <xs:annotation>
-            <xs:documentation>Maximum queue size.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="keepAliveTimeSeconds" type="xs:integer">
-          <xs:annotation>
-            <xs:documentation>The number of seconds a connection will remain idle before the first keep-alive probe is sent</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="ndlcItemSeparator" type="xs:string">
-          <xs:annotation>
-            <xs:documentation>NDLC item separator.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="includeSourceInfo" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Indicates whether to include source info (file name and line number) in the information sent over the network.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="loggerName" type="SimpleLayoutAttribute">
-          <xs:annotation>
-            <xs:documentation>Renderer for log4j:event logger-xml-attribute (Default ${logger})</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="includeNLogData" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Indicates whether to include NLog-specific extensions to log4j schema.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="includeNdlc" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Indicates whether to include contents of the  stack.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="includeNdc" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Indicates whether to include  stack contents.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="includeMdlc" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Indicates whether to include  dictionary contents.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="includeMdc" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Indicates whether to include  dictionary contents.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="includeCallSite" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Indicates whether to include call site (class and method name) in the information sent over the network.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="includeAllProperties" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Option to include all properties from the log events</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="appInfo" type="xs:string">
-          <xs:annotation>
-            <xs:documentation>AppInfo field. By default it's the friendly name of the current AppDomain.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="ndcItemSeparator" type="xs:string">
-          <xs:annotation>
-            <xs:documentation>NDC item separator.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="optimizeBufferReuse" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-      </xs:extension>
-    </xs:complexContent>
-  </xs:complexType>
-  <xs:complexType name="Null">
-    <xs:complexContent>
-      <xs:extension base="Target">
-        <xs:choice minOccurs="0" maxOccurs="unbounded">
-          <xs:element name="name" minOccurs="0" maxOccurs="1" type="xs:string" />
-          <xs:element name="layout" minOccurs="0" maxOccurs="1" type="Layout" />
-          <xs:element name="formatMessage" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-          <xs:element name="optimizeBufferReuse" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-        </xs:choice>
-        <xs:attribute name="name" type="xs:string">
-          <xs:annotation>
-            <xs:documentation>Name of the target.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="layout" type="SimpleLayoutAttribute">
-          <xs:annotation>
-            <xs:documentation>Layout used to format log messages.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="formatMessage" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Indicates whether to perform layout calculation.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="optimizeBufferReuse" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-      </xs:extension>
-    </xs:complexContent>
-  </xs:complexType>
-  <xs:complexType name="OutputDebugString">
-    <xs:complexContent>
-      <xs:extension base="Target">
-        <xs:choice minOccurs="0" maxOccurs="unbounded">
-          <xs:element name="name" minOccurs="0" maxOccurs="1" type="xs:string" />
-          <xs:element name="layout" minOccurs="0" maxOccurs="1" type="Layout" />
-          <xs:element name="optimizeBufferReuse" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-        </xs:choice>
-        <xs:attribute name="name" type="xs:string">
-          <xs:annotation>
-            <xs:documentation>Name of the target.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="layout" type="SimpleLayoutAttribute">
-          <xs:annotation>
-            <xs:documentation>Layout used to format log messages.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="optimizeBufferReuse" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-      </xs:extension>
-    </xs:complexContent>
-  </xs:complexType>
-  <xs:complexType name="PerfCounter">
-    <xs:complexContent>
-      <xs:extension base="Target">
-        <xs:choice minOccurs="0" maxOccurs="unbounded">
-          <xs:element name="name" minOccurs="0" maxOccurs="1" type="xs:string" />
-          <xs:element name="autoCreate" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-          <xs:element name="categoryName" minOccurs="0" maxOccurs="1" type="xs:string" />
-          <xs:element name="counterHelp" minOccurs="0" maxOccurs="1" type="xs:string" />
-          <xs:element name="counterName" minOccurs="0" maxOccurs="1" type="xs:string" />
-          <xs:element name="counterType" minOccurs="0" maxOccurs="1" type="System.Diagnostics.PerformanceCounterType" />
-          <xs:element name="incrementValue" minOccurs="0" maxOccurs="1" type="Layout" />
-          <xs:element name="instanceName" minOccurs="0" maxOccurs="1" type="xs:string" />
-          <xs:element name="optimizeBufferReuse" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-        </xs:choice>
-        <xs:attribute name="name" type="xs:string">
-          <xs:annotation>
-            <xs:documentation>Name of the target.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="autoCreate" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Indicates whether performance counter should be automatically created.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="categoryName" type="xs:string">
-          <xs:annotation>
-            <xs:documentation>Name of the performance counter category.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="counterHelp" type="xs:string">
-          <xs:annotation>
-            <xs:documentation>Counter help text.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="counterName" type="xs:string">
-          <xs:annotation>
-            <xs:documentation>Name of the performance counter.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="counterType" type="System.Diagnostics.PerformanceCounterType">
-          <xs:annotation>
-            <xs:documentation>Performance counter type.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="incrementValue" type="SimpleLayoutAttribute">
-          <xs:annotation>
-            <xs:documentation>The value by which to increment the counter.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="instanceName" type="xs:string">
-          <xs:annotation>
-            <xs:documentation>Performance counter instance name.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="optimizeBufferReuse" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-      </xs:extension>
-    </xs:complexContent>
-  </xs:complexType>
-  <xs:simpleType name="System.Diagnostics.PerformanceCounterType">
-    <xs:restriction base="xs:string">
-      <xs:enumeration value="NumberOfItems32" />
-      <xs:enumeration value="NumberOfItems64" />
-      <xs:enumeration value="NumberOfItemsHEX32" />
-      <xs:enumeration value="NumberOfItemsHEX64" />
-      <xs:enumeration value="RateOfCountsPerSecond32" />
-      <xs:enumeration value="RateOfCountsPerSecond64" />
-      <xs:enumeration value="CountPerTimeInterval32" />
-      <xs:enumeration value="CountPerTimeInterval64" />
-      <xs:enumeration value="RawFraction" />
-      <xs:enumeration value="RawBase" />
-      <xs:enumeration value="AverageTimer32" />
-      <xs:enumeration value="AverageBase" />
-      <xs:enumeration value="AverageCount64" />
-      <xs:enumeration value="SampleFraction" />
-      <xs:enumeration value="SampleCounter" />
-      <xs:enumeration value="SampleBase" />
-      <xs:enumeration value="CounterTimer" />
-      <xs:enumeration value="CounterTimerInverse" />
-      <xs:enumeration value="Timer100Ns" />
-      <xs:enumeration value="Timer100NsInverse" />
-      <xs:enumeration value="ElapsedTime" />
-      <xs:enumeration value="CounterMultiTimer" />
-      <xs:enumeration value="CounterMultiTimerInverse" />
-      <xs:enumeration value="CounterMultiTimer100Ns" />
-      <xs:enumeration value="CounterMultiTimer100NsInverse" />
-      <xs:enumeration value="CounterMultiBase" />
-      <xs:enumeration value="CounterDelta32" />
-      <xs:enumeration value="CounterDelta64" />
-    </xs:restriction>
-  </xs:simpleType>
-  <xs:complexType name="PostFilteringWrapper">
-    <xs:complexContent>
-      <xs:extension base="WrapperTargetBase">
-        <xs:choice minOccurs="0" maxOccurs="unbounded">
-          <xs:element name="name" minOccurs="0" maxOccurs="1" type="xs:string" />
-          <xs:element name="defaultFilter" minOccurs="0" maxOccurs="1" type="Condition" />
-          <xs:element name="when" minOccurs="0" maxOccurs="unbounded" type="NLog.Targets.Wrappers.FilteringRule" />
-          <xs:element name="optimizeBufferReuse" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-        </xs:choice>
-        <xs:attribute name="name" type="xs:string">
-          <xs:annotation>
-            <xs:documentation>Name of the target.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="defaultFilter" type="Condition">
-          <xs:annotation>
-            <xs:documentation>Default filter to be applied when no specific rule matches.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="optimizeBufferReuse" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-      </xs:extension>
-    </xs:complexContent>
-  </xs:complexType>
-  <xs:complexType name="NLog.Targets.Wrappers.FilteringRule">
-    <xs:choice minOccurs="0" maxOccurs="unbounded">
-      <xs:element name="exists" minOccurs="0" maxOccurs="1" type="Condition" />
-      <xs:element name="filter" minOccurs="0" maxOccurs="1" type="Condition" />
-    </xs:choice>
-    <xs:attribute name="exists" type="Condition">
-      <xs:annotation>
-        <xs:documentation>Condition to be tested.</xs:documentation>
-      </xs:annotation>
-    </xs:attribute>
-    <xs:attribute name="filter" type="Condition">
-      <xs:annotation>
-        <xs:documentation>Resulting filter to be applied when the condition matches.</xs:documentation>
-      </xs:annotation>
-    </xs:attribute>
-  </xs:complexType>
-  <xs:complexType name="RandomizeGroup">
-    <xs:complexContent>
-      <xs:extension base="CompoundTargetBase">
-        <xs:choice minOccurs="0" maxOccurs="unbounded">
-          <xs:element name="name" minOccurs="0" maxOccurs="1" type="xs:string" />
-          <xs:element name="optimizeBufferReuse" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-        </xs:choice>
-        <xs:attribute name="name" type="xs:string">
-          <xs:annotation>
-            <xs:documentation>Name of the target.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="optimizeBufferReuse" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-      </xs:extension>
-    </xs:complexContent>
-  </xs:complexType>
-  <xs:complexType name="RepeatingWrapper">
-    <xs:complexContent>
-      <xs:extension base="WrapperTargetBase">
-        <xs:choice minOccurs="0" maxOccurs="unbounded">
-          <xs:element name="name" minOccurs="0" maxOccurs="1" type="xs:string" />
-          <xs:element name="optimizeBufferReuse" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-          <xs:element name="repeatCount" minOccurs="0" maxOccurs="1" type="xs:integer" />
-        </xs:choice>
-        <xs:attribute name="name" type="xs:string">
-          <xs:annotation>
-            <xs:documentation>Name of the target.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="optimizeBufferReuse" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="repeatCount" type="xs:integer">
-          <xs:annotation>
-            <xs:documentation>Number of times to repeat each log message.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-      </xs:extension>
-    </xs:complexContent>
-  </xs:complexType>
-  <xs:complexType name="RetryingWrapper">
-    <xs:complexContent>
-      <xs:extension base="WrapperTargetBase">
-        <xs:choice minOccurs="0" maxOccurs="unbounded">
-          <xs:element name="name" minOccurs="0" maxOccurs="1" type="xs:string" />
-          <xs:element name="optimizeBufferReuse" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-          <xs:element name="retryCount" minOccurs="0" maxOccurs="1" type="xs:integer" />
-          <xs:element name="retryDelayMilliseconds" minOccurs="0" maxOccurs="1" type="xs:integer" />
-        </xs:choice>
-        <xs:attribute name="name" type="xs:string">
-          <xs:annotation>
-            <xs:documentation>Name of the target.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="optimizeBufferReuse" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="retryCount" type="xs:integer">
-          <xs:annotation>
-            <xs:documentation>Number of retries that should be attempted on the wrapped target in case of a failure.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="retryDelayMilliseconds" type="xs:integer">
-          <xs:annotation>
-            <xs:documentation>Time to wait between retries in milliseconds.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-      </xs:extension>
-    </xs:complexContent>
-  </xs:complexType>
-  <xs:complexType name="RoundRobinGroup">
-    <xs:complexContent>
-      <xs:extension base="CompoundTargetBase">
-        <xs:choice minOccurs="0" maxOccurs="unbounded">
-          <xs:element name="name" minOccurs="0" maxOccurs="1" type="xs:string" />
-          <xs:element name="optimizeBufferReuse" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-        </xs:choice>
-        <xs:attribute name="name" type="xs:string">
-          <xs:annotation>
-            <xs:documentation>Name of the target.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="optimizeBufferReuse" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-      </xs:extension>
-    </xs:complexContent>
-  </xs:complexType>
-  <xs:complexType name="SplitGroup">
-    <xs:complexContent>
-      <xs:extension base="CompoundTargetBase">
-        <xs:choice minOccurs="0" maxOccurs="unbounded">
-          <xs:element name="name" minOccurs="0" maxOccurs="1" type="xs:string" />
-          <xs:element name="optimizeBufferReuse" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-        </xs:choice>
-        <xs:attribute name="name" type="xs:string">
-          <xs:annotation>
-            <xs:documentation>Name of the target.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="optimizeBufferReuse" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-      </xs:extension>
-    </xs:complexContent>
-  </xs:complexType>
-  <xs:complexType name="Trace">
-    <xs:complexContent>
-      <xs:extension base="Target">
-        <xs:choice minOccurs="0" maxOccurs="unbounded">
-          <xs:element name="name" minOccurs="0" maxOccurs="1" type="xs:string" />
-          <xs:element name="layout" minOccurs="0" maxOccurs="1" type="Layout" />
-          <xs:element name="rawWrite" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-          <xs:element name="optimizeBufferReuse" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-        </xs:choice>
-        <xs:attribute name="name" type="xs:string">
-          <xs:annotation>
-            <xs:documentation>Name of the target.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="layout" type="SimpleLayoutAttribute">
-          <xs:annotation>
-            <xs:documentation>Layout used to format log messages.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="rawWrite" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Always use  independent of </xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="optimizeBufferReuse" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-      </xs:extension>
-    </xs:complexContent>
-  </xs:complexType>
-  <xs:complexType name="WebService">
-    <xs:complexContent>
-      <xs:extension base="Target">
-        <xs:choice minOccurs="0" maxOccurs="unbounded">
-          <xs:element name="name" minOccurs="0" maxOccurs="1" type="xs:string" />
-          <xs:element name="parameter" minOccurs="0" maxOccurs="unbounded" type="NLog.Targets.MethodCallParameter" />
-          <xs:element name="optimizeBufferReuse" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-          <xs:element name="includeBOM" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-          <xs:element name="methodName" minOccurs="0" maxOccurs="1" type="xs:string" />
-          <xs:element name="namespace" minOccurs="0" maxOccurs="1" type="xs:string" />
-          <xs:element name="protocol" minOccurs="0" maxOccurs="1" type="NLog.Targets.WebServiceProtocol" />
-          <xs:element name="proxyAddress" minOccurs="0" maxOccurs="1" type="xs:string" />
-          <xs:element name="encoding" minOccurs="0" maxOccurs="1" type="xs:string" />
-          <xs:element name="url" minOccurs="0" maxOccurs="1" type="xs:anyURI" />
-          <xs:element name="escapeDataNLogLegacy" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-          <xs:element name="escapeDataRfc3986" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-          <xs:element name="preAuthenticate" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-          <xs:element name="xmlRoot" minOccurs="0" maxOccurs="1" type="xs:string" />
-          <xs:element name="xmlRootNamespace" minOccurs="0" maxOccurs="1" type="xs:string" />
-          <xs:element name="header" minOccurs="0" maxOccurs="unbounded" type="NLog.Targets.MethodCallParameter" />
-          <xs:element name="proxyType" minOccurs="0" maxOccurs="1" type="NLog.Targets.WebServiceProxyType" />
-        </xs:choice>
-        <xs:attribute name="name" type="xs:string">
-          <xs:annotation>
-            <xs:documentation>Name of the target.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="optimizeBufferReuse" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Target supports reuse of internal buffers, and doesn't have to constantly allocate new buffers Required for legacy NLog-targets, that expects buffers to remain stable after Write-method exit</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="includeBOM" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Should we include the BOM (Byte-order-mark) for UTF? Influences the  property. This will only work for UTF-8.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="methodName" type="xs:string">
-          <xs:annotation>
-            <xs:documentation>Web service method name. Only used with Soap.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="namespace" type="xs:string">
-          <xs:annotation>
-            <xs:documentation>Web service namespace. Only used with Soap.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="protocol" type="NLog.Targets.WebServiceProtocol">
-          <xs:annotation>
-            <xs:documentation>Protocol to be used when calling web service.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="proxyAddress" type="xs:string">
-          <xs:annotation>
-            <xs:documentation>Custom proxy address, include port separated by a colon</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="encoding" type="xs:string">
-          <xs:annotation>
-            <xs:documentation>Encoding.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="url" type="xs:anyURI">
-          <xs:annotation>
-            <xs:documentation>Web service URL.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="escapeDataNLogLegacy" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Value whether escaping be done according to the old NLog style (Very non-standard)</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="escapeDataRfc3986" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Value whether escaping be done according to Rfc3986 (Supports Internationalized Resource Identifiers - IRIs)</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="preAuthenticate" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Indicates whether to pre-authenticate the HttpWebRequest (Requires 'Authorization' in  parameters)</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="xmlRoot" type="xs:string">
-          <xs:annotation>
-            <xs:documentation>Name of the root XML element, if POST of XML document chosen. If so, this property must not be null. (see  and ).</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="xmlRootNamespace" type="xs:string">
-          <xs:annotation>
-            <xs:documentation>(optional) root namespace of the XML document, if POST of XML document chosen. (see  and ).</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="proxyType" type="NLog.Targets.WebServiceProxyType">
-          <xs:annotation>
-            <xs:documentation>Proxy configuration when calling web service</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-      </xs:extension>
-    </xs:complexContent>
-  </xs:complexType>
-  <xs:simpleType name="NLog.Targets.WebServiceProtocol">
-    <xs:restriction base="xs:string">
-      <xs:enumeration value="Soap11" />
-      <xs:enumeration value="Soap12" />
-      <xs:enumeration value="HttpPost" />
-      <xs:enumeration value="HttpGet" />
-      <xs:enumeration value="JsonPost" />
-      <xs:enumeration value="XmlPost" />
-    </xs:restriction>
-  </xs:simpleType>
-  <xs:simpleType name="NLog.Targets.WebServiceProxyType">
-    <xs:restriction base="xs:string">
-      <xs:enumeration value="DefaultWebProxy" />
-      <xs:enumeration value="AutoProxy" />
-      <xs:enumeration value="NoProxy" />
-      <xs:enumeration value="ProxyAddress" />
-    </xs:restriction>
-  </xs:simpleType>
-  <xs:complexType name="CompoundLayout">
-    <xs:complexContent>
-      <xs:extension base="Layout">
-        <xs:choice minOccurs="0" maxOccurs="unbounded">
-          <xs:element name="layout" minOccurs="0" maxOccurs="unbounded" type="Layout" />
-        </xs:choice>
-      </xs:extension>
-    </xs:complexContent>
-  </xs:complexType>
-  <xs:complexType name="Layout">
-    <xs:choice minOccurs="0" maxOccurs="unbounded" />
-  </xs:complexType>
-  <xs:complexType name="CsvLayout">
-    <xs:complexContent>
-      <xs:extension base="Layout">
-        <xs:choice minOccurs="0" maxOccurs="unbounded">
-          <xs:element name="footer" minOccurs="0" maxOccurs="1" type="Layout" />
-          <xs:element name="header" minOccurs="0" maxOccurs="1" type="Layout" />
-          <xs:element name="layout" minOccurs="0" maxOccurs="1" type="Layout" />
-          <xs:element name="column" minOccurs="0" maxOccurs="unbounded" type="NLog.Layouts.CsvColumn" />
-          <xs:element name="customColumnDelimiter" minOccurs="0" maxOccurs="1" type="xs:string" />
-          <xs:element name="delimiter" minOccurs="0" maxOccurs="1" type="NLog.Layouts.CsvColumnDelimiterMode" />
-          <xs:element name="quoteChar" minOccurs="0" maxOccurs="1" type="xs:string" />
-          <xs:element name="quoting" minOccurs="0" maxOccurs="1" type="NLog.Layouts.CsvQuotingMode" />
-          <xs:element name="withHeader" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-        </xs:choice>
-        <xs:attribute name="footer" type="SimpleLayoutAttribute">
-          <xs:annotation>
-            <xs:documentation>Footer layout.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="header" type="SimpleLayoutAttribute">
-          <xs:annotation>
-            <xs:documentation>Header layout.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="layout" type="SimpleLayoutAttribute">
-          <xs:annotation>
-            <xs:documentation>Body layout (can be repeated multiple times).</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="customColumnDelimiter" type="xs:string">
-          <xs:annotation>
-            <xs:documentation>Custom column delimiter value (valid when ColumnDelimiter is set to 'Custom').</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="delimiter" type="NLog.Layouts.CsvColumnDelimiterMode">
-          <xs:annotation>
-            <xs:documentation>Column delimiter.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="quoteChar" type="xs:string">
-          <xs:annotation>
-            <xs:documentation>Quote Character.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="quoting" type="NLog.Layouts.CsvQuotingMode">
-          <xs:annotation>
-            <xs:documentation>Quoting mode.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="withHeader" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Indicates whether CVS should include header.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-      </xs:extension>
-    </xs:complexContent>
-  </xs:complexType>
-  <xs:simpleType name="NLog.Layouts.CsvQuotingMode">
-    <xs:restriction base="xs:string">
-      <xs:enumeration value="All" />
-      <xs:enumeration value="Nothing" />
-      <xs:enumeration value="Auto" />
-    </xs:restriction>
-  </xs:simpleType>
-  <xs:simpleType name="NLog.Layouts.CsvColumnDelimiterMode">
-    <xs:restriction base="xs:string">
-      <xs:enumeration value="Auto" />
-      <xs:enumeration value="Comma" />
-      <xs:enumeration value="Semicolon" />
-      <xs:enumeration value="Tab" />
-      <xs:enumeration value="Pipe" />
-      <xs:enumeration value="Space" />
-      <xs:enumeration value="Custom" />
-    </xs:restriction>
-  </xs:simpleType>
-  <xs:complexType name="NLog.Layouts.CsvColumn">
-    <xs:choice minOccurs="0" maxOccurs="unbounded">
-      <xs:element name="layout" minOccurs="0" maxOccurs="1" type="Layout" />
-      <xs:element name="name" minOccurs="0" maxOccurs="1" type="xs:string" />
-      <xs:element name="quoting" minOccurs="0" maxOccurs="1" type="NLog.Layouts.CsvQuotingMode" />
-    </xs:choice>
-    <xs:attribute name="layout" type="SimpleLayoutAttribute">
-      <xs:annotation>
-        <xs:documentation>Layout of the column.</xs:documentation>
-      </xs:annotation>
-    </xs:attribute>
-    <xs:attribute name="name" type="xs:string">
-      <xs:annotation>
-        <xs:documentation>Name of the column.</xs:documentation>
-      </xs:annotation>
-    </xs:attribute>
-    <xs:attribute name="quoting" type="NLog.Layouts.CsvQuotingMode">
-      <xs:annotation>
-        <xs:documentation>Override of Quoting mode</xs:documentation>
-      </xs:annotation>
-    </xs:attribute>
-  </xs:complexType>
-  <xs:complexType name="JsonLayout">
-    <xs:complexContent>
-      <xs:extension base="Layout">
-        <xs:choice minOccurs="0" maxOccurs="unbounded">
-          <xs:element name="attribute" minOccurs="0" maxOccurs="unbounded" type="NLog.Layouts.JsonAttribute" />
-          <xs:element name="excludeProperties" minOccurs="0" maxOccurs="1" type="xs:string" />
-          <xs:element name="includeAllProperties" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-          <xs:element name="includeGdc" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-          <xs:element name="includeMdc" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-          <xs:element name="includeMdlc" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-          <xs:element name="maxRecursionLimit" minOccurs="0" maxOccurs="1" type="xs:integer" />
-          <xs:element name="renderEmptyObject" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-          <xs:element name="suppressSpaces" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-          <xs:element name="escapeForwardSlash" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-        </xs:choice>
-        <xs:attribute name="excludeProperties" type="xs:string">
-          <xs:annotation>
-            <xs:documentation>List of property names to exclude when  is true</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="includeAllProperties" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Option to include all properties from the log event (as JSON)</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="includeGdc" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Indicates whether to include contents of the  dictionary.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="includeMdc" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Indicates whether to include contents of the  dictionary.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="includeMdlc" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Indicates whether to include contents of the  dictionary.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="maxRecursionLimit" type="xs:integer">
-          <xs:annotation>
-            <xs:documentation>How far should the JSON serializer follow object references before backing off</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="renderEmptyObject" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Option to render the empty object value {}</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="suppressSpaces" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Option to suppress the extra spaces in the output json</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="escapeForwardSlash" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Should forward slashes be escaped? If true, / will be converted to \/</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-      </xs:extension>
-    </xs:complexContent>
-  </xs:complexType>
-  <xs:complexType name="NLog.Layouts.JsonAttribute">
-    <xs:choice minOccurs="0" maxOccurs="unbounded">
-      <xs:element name="layout" minOccurs="0" maxOccurs="1" type="Layout" />
-      <xs:element name="name" minOccurs="0" maxOccurs="1" type="xs:string" />
-      <xs:element name="encode" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-      <xs:element name="escapeUnicode" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-      <xs:element name="includeEmptyValue" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-      <xs:element name="escapeForwardSlash" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-    </xs:choice>
-    <xs:attribute name="layout" type="SimpleLayoutAttribute">
-      <xs:annotation>
-        <xs:documentation>Layout that will be rendered as the attribute's value.</xs:documentation>
-      </xs:annotation>
-    </xs:attribute>
-    <xs:attribute name="name" type="xs:string">
-      <xs:annotation>
-        <xs:documentation>Name of the attribute.</xs:documentation>
-      </xs:annotation>
-    </xs:attribute>
-    <xs:attribute name="encode" type="xs:boolean">
-      <xs:annotation>
-        <xs:documentation>Determines whether or not this attribute will be Json encoded.</xs:documentation>
-      </xs:annotation>
-    </xs:attribute>
-    <xs:attribute name="escapeUnicode" type="xs:boolean">
-      <xs:annotation>
-        <xs:documentation>Indicates whether to escape non-ascii characters</xs:documentation>
-      </xs:annotation>
-    </xs:attribute>
-    <xs:attribute name="includeEmptyValue" type="xs:boolean">
-      <xs:annotation>
-        <xs:documentation>Whether an attribute with empty value should be included in the output</xs:documentation>
-      </xs:annotation>
-    </xs:attribute>
-    <xs:attribute name="escapeForwardSlash" type="xs:boolean">
-      <xs:annotation>
-        <xs:documentation>Should forward slashes be escaped? If true, / will be converted to \/</xs:documentation>
-      </xs:annotation>
-    </xs:attribute>
-  </xs:complexType>
-  <xs:complexType name="LayoutWithHeaderAndFooter">
-    <xs:complexContent>
-      <xs:extension base="Layout">
-        <xs:choice minOccurs="0" maxOccurs="unbounded">
-          <xs:element name="footer" minOccurs="0" maxOccurs="1" type="Layout" />
-          <xs:element name="header" minOccurs="0" maxOccurs="1" type="Layout" />
-          <xs:element name="layout" minOccurs="0" maxOccurs="1" type="Layout" />
-        </xs:choice>
-        <xs:attribute name="footer" type="SimpleLayoutAttribute">
-          <xs:annotation>
-            <xs:documentation>Footer layout.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="header" type="SimpleLayoutAttribute">
-          <xs:annotation>
-            <xs:documentation>Header layout.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="layout" type="SimpleLayoutAttribute">
-          <xs:annotation>
-            <xs:documentation>Body layout (can be repeated multiple times).</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-      </xs:extension>
-    </xs:complexContent>
-  </xs:complexType>
-  <xs:complexType name="Log4JXmlEventLayout">
-    <xs:complexContent>
-      <xs:extension base="Layout">
-        <xs:choice minOccurs="0" maxOccurs="unbounded">
-          <xs:element name="includeAllProperties" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-          <xs:element name="includeCallSite" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-          <xs:element name="includeMdc" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-          <xs:element name="includeMdlc" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-          <xs:element name="includeNdc" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-          <xs:element name="includeNdlc" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-          <xs:element name="includeSourceInfo" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-          <xs:element name="parameter" minOccurs="0" maxOccurs="unbounded" type="NLog.Targets.NLogViewerParameterInfo" />
-        </xs:choice>
-        <xs:attribute name="includeAllProperties" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Option to include all properties from the log events</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="includeCallSite" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Indicates whether to include call site (class and method name) in the information sent over the network.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="includeMdc" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Indicates whether to include contents of the  dictionary.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="includeMdlc" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Indicates whether to include contents of the  dictionary.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="includeNdc" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Indicates whether to include contents of the  stack.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="includeNdlc" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Indicates whether to include contents of the  stack.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="includeSourceInfo" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Indicates whether to include source info (file name and line number) in the information sent over the network.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-      </xs:extension>
-    </xs:complexContent>
-  </xs:complexType>
-  <xs:complexType name="SimpleLayout">
-    <xs:complexContent>
-      <xs:extension base="Layout">
-        <xs:choice minOccurs="0" maxOccurs="unbounded">
-          <xs:element name="text" minOccurs="0" maxOccurs="1" type="xs:string" />
-        </xs:choice>
-        <xs:attribute name="text" type="xs:string">
-          <xs:annotation>
-            <xs:documentation>Layout text.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-      </xs:extension>
-    </xs:complexContent>
-  </xs:complexType>
-  <xs:complexType name="XmlLayout">
-    <xs:complexContent>
-      <xs:extension base="Layout">
-        <xs:choice minOccurs="0" maxOccurs="unbounded">
-          <xs:element name="excludeProperties" minOccurs="0" maxOccurs="1" type="xs:string" />
-          <xs:element name="includeAllProperties" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-          <xs:element name="includeMdc" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-          <xs:element name="includeMdlc" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-          <xs:element name="maxRecursionLimit" minOccurs="0" maxOccurs="1" type="xs:integer" />
-          <xs:element name="propertiesCollectionItemName" minOccurs="0" maxOccurs="1" type="xs:string" />
-          <xs:element name="propertiesElementKeyAttribute" minOccurs="0" maxOccurs="1" type="xs:string" />
-          <xs:element name="propertiesElementName" minOccurs="0" maxOccurs="1" type="xs:string" />
-          <xs:element name="propertiesElementValueAttribute" minOccurs="0" maxOccurs="1" type="xs:string" />
-          <xs:element name="attribute" minOccurs="0" maxOccurs="unbounded" type="NLog.Layouts.XmlAttribute" />
-          <xs:element name="elementName" minOccurs="0" maxOccurs="1" type="xs:string" />
-          <xs:element name="element" minOccurs="0" maxOccurs="unbounded" type="NLog.Layouts.XmlElement" />
-          <xs:element name="elementValue" minOccurs="0" maxOccurs="1" type="Layout" />
-          <xs:element name="includeEmptyValue" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-          <xs:element name="indentXml" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-          <xs:element name="elementEncode" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-        </xs:choice>
-        <xs:attribute name="excludeProperties" type="xs:string">
-          <xs:annotation>
-            <xs:documentation>List of property names to exclude when  is true</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="includeAllProperties" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Option to include all properties from the log event (as XML)</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="includeMdc" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Indicates whether to include contents of the  dictionary.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="includeMdlc" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Indicates whether to include contents of the  dictionary.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="maxRecursionLimit" type="xs:integer">
-          <xs:annotation>
-            <xs:documentation>How far should the XML serializer follow object references before backing off</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="propertiesCollectionItemName" type="xs:string">
-          <xs:annotation>
-            <xs:documentation>XML element name to use for rendering IList-collections items</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="propertiesElementKeyAttribute" type="xs:string">
-          <xs:annotation>
-            <xs:documentation>XML attribute name to use when rendering property-key When null (or empty) then key-attribute is not included</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="propertiesElementName" type="xs:string">
-          <xs:annotation>
-            <xs:documentation>XML element name to use when rendering properties</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="propertiesElementValueAttribute" type="xs:string">
-          <xs:annotation>
-            <xs:documentation>XML attribute name to use when rendering property-value When null (or empty) then value-attribute is not included and value is formatted as XML-element-value</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="elementName" type="xs:string">
-          <xs:annotation>
-            <xs:documentation>Name of the root XML element</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="elementValue" type="SimpleLayoutAttribute">
-          <xs:annotation>
-            <xs:documentation>Value inside the root XML element</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="includeEmptyValue" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Whether a ElementValue with empty value should be included in the output</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="indentXml" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Auto indent and create new lines</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="elementEncode" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Determines whether or not this attribute will be Xml encoded.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-      </xs:extension>
-    </xs:complexContent>
-  </xs:complexType>
-  <xs:complexType name="NLog.Layouts.XmlAttribute">
-    <xs:choice minOccurs="0" maxOccurs="unbounded">
-      <xs:element name="layout" minOccurs="0" maxOccurs="1" type="Layout" />
-      <xs:element name="name" minOccurs="0" maxOccurs="1" type="xs:string" />
-      <xs:element name="encode" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-      <xs:element name="includeEmptyValue" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-    </xs:choice>
-    <xs:attribute name="layout" type="SimpleLayoutAttribute">
-      <xs:annotation>
-        <xs:documentation>Layout that will be rendered as the attribute's value.</xs:documentation>
-      </xs:annotation>
-    </xs:attribute>
-    <xs:attribute name="name" type="xs:string">
-      <xs:annotation>
-        <xs:documentation>Name of the attribute.</xs:documentation>
-      </xs:annotation>
-    </xs:attribute>
-    <xs:attribute name="encode" type="xs:boolean">
-      <xs:annotation>
-        <xs:documentation>Determines whether or not this attribute will be Xml encoded.</xs:documentation>
-      </xs:annotation>
-    </xs:attribute>
-    <xs:attribute name="includeEmptyValue" type="xs:boolean">
-      <xs:annotation>
-        <xs:documentation>Whether an attribute with empty value should be included in the output</xs:documentation>
-      </xs:annotation>
-    </xs:attribute>
-  </xs:complexType>
-  <xs:complexType name="NLog.Layouts.XmlElement">
-    <xs:choice minOccurs="0" maxOccurs="unbounded">
-      <xs:element name="encode" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-      <xs:element name="name" minOccurs="0" maxOccurs="1" type="xs:string" />
-      <xs:element name="value" minOccurs="0" maxOccurs="1" type="Layout" />
-      <xs:element name="attribute" minOccurs="0" maxOccurs="unbounded" type="NLog.Layouts.XmlAttribute" />
-      <xs:element name="element" minOccurs="0" maxOccurs="unbounded" type="NLog.Layouts.XmlElement" />
-      <xs:element name="includeEmptyValue" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-      <xs:element name="indentXml" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-      <xs:element name="excludeProperties" minOccurs="0" maxOccurs="1" type="xs:string" />
-      <xs:element name="includeAllProperties" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-      <xs:element name="includeMdc" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-      <xs:element name="includeMdlc" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-      <xs:element name="maxRecursionLimit" minOccurs="0" maxOccurs="1" type="xs:integer" />
-      <xs:element name="propertiesCollectionItemName" minOccurs="0" maxOccurs="1" type="xs:string" />
-      <xs:element name="propertiesElementKeyAttribute" minOccurs="0" maxOccurs="1" type="xs:string" />
-      <xs:element name="propertiesElementName" minOccurs="0" maxOccurs="1" type="xs:string" />
-      <xs:element name="propertiesElementValueAttribute" minOccurs="0" maxOccurs="1" type="xs:string" />
-    </xs:choice>
-    <xs:attribute name="encode" type="xs:boolean">
-      <xs:annotation>
-        <xs:documentation>Determines whether or not this attribute will be Xml encoded.</xs:documentation>
-      </xs:annotation>
-    </xs:attribute>
-    <xs:attribute name="name" type="xs:string">
-      <xs:annotation>
-        <xs:documentation>Name of the element</xs:documentation>
-      </xs:annotation>
-    </xs:attribute>
-    <xs:attribute name="value" type="SimpleLayoutAttribute">
-      <xs:annotation>
-        <xs:documentation>Value inside the element</xs:documentation>
-      </xs:annotation>
-    </xs:attribute>
-    <xs:attribute name="includeEmptyValue" type="xs:boolean">
-      <xs:annotation>
-        <xs:documentation>Whether a ElementValue with empty value should be included in the output</xs:documentation>
-      </xs:annotation>
-    </xs:attribute>
-    <xs:attribute name="indentXml" type="xs:boolean">
-      <xs:annotation>
-        <xs:documentation>Auto indent and create new lines</xs:documentation>
-      </xs:annotation>
-    </xs:attribute>
-    <xs:attribute name="excludeProperties" type="xs:string">
-      <xs:annotation>
-        <xs:documentation>List of property names to exclude when  is true</xs:documentation>
-      </xs:annotation>
-    </xs:attribute>
-    <xs:attribute name="includeAllProperties" type="xs:boolean">
-      <xs:annotation>
-        <xs:documentation>Option to include all properties from the log event (as XML)</xs:documentation>
-      </xs:annotation>
-    </xs:attribute>
-    <xs:attribute name="includeMdc" type="xs:boolean">
-      <xs:annotation>
-        <xs:documentation>Indicates whether to include contents of the  dictionary.</xs:documentation>
-      </xs:annotation>
-    </xs:attribute>
-    <xs:attribute name="includeMdlc" type="xs:boolean">
-      <xs:annotation>
-        <xs:documentation>Indicates whether to include contents of the  dictionary.</xs:documentation>
-      </xs:annotation>
-    </xs:attribute>
-    <xs:attribute name="maxRecursionLimit" type="xs:integer">
-      <xs:annotation>
-        <xs:documentation>How far should the XML serializer follow object references before backing off</xs:documentation>
-      </xs:annotation>
-    </xs:attribute>
-    <xs:attribute name="propertiesCollectionItemName" type="xs:string">
-      <xs:annotation>
-        <xs:documentation>XML element name to use for rendering IList-collections items</xs:documentation>
-      </xs:annotation>
-    </xs:attribute>
-    <xs:attribute name="propertiesElementKeyAttribute" type="xs:string">
-      <xs:annotation>
-        <xs:documentation>XML attribute name to use when rendering property-key When null (or empty) then key-attribute is not included</xs:documentation>
-      </xs:annotation>
-    </xs:attribute>
-    <xs:attribute name="propertiesElementName" type="xs:string">
-      <xs:annotation>
-        <xs:documentation>XML element name to use when rendering properties</xs:documentation>
-      </xs:annotation>
-    </xs:attribute>
-    <xs:attribute name="propertiesElementValueAttribute" type="xs:string">
-      <xs:annotation>
-        <xs:documentation>XML attribute name to use when rendering property-value When null (or empty) then value-attribute is not included and value is formatted as XML-element-value</xs:documentation>
-      </xs:annotation>
-    </xs:attribute>
-  </xs:complexType>
-  <xs:complexType name="when">
-    <xs:complexContent>
-      <xs:extension base="Filter">
-        <xs:choice minOccurs="0" maxOccurs="unbounded">
-          <xs:element name="action" minOccurs="0" maxOccurs="1" type="FilterResult" />
-          <xs:element name="condition" minOccurs="0" maxOccurs="1" type="Condition" />
-        </xs:choice>
-        <xs:attribute name="action" type="FilterResult">
-          <xs:annotation>
-            <xs:documentation>Action to be taken when filter matches.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="condition" type="Condition">
-          <xs:annotation>
-            <xs:documentation>Condition expression.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-      </xs:extension>
-    </xs:complexContent>
-  </xs:complexType>
-  <xs:simpleType name="FilterResult">
-    <xs:restriction base="xs:string">
-      <xs:enumeration value="Neutral" />
-      <xs:enumeration value="Log" />
-      <xs:enumeration value="Ignore" />
-      <xs:enumeration value="LogFinal" />
-      <xs:enumeration value="IgnoreFinal" />
-    </xs:restriction>
-  </xs:simpleType>
-  <xs:complexType name="whenContains">
-    <xs:complexContent>
-      <xs:extension base="Filter">
-        <xs:choice minOccurs="0" maxOccurs="unbounded">
-          <xs:element name="action" minOccurs="0" maxOccurs="1" type="FilterResult" />
-          <xs:element name="ignoreCase" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-          <xs:element name="layout" minOccurs="0" maxOccurs="1" type="Layout" />
-          <xs:element name="substring" minOccurs="0" maxOccurs="1" type="xs:string" />
-        </xs:choice>
-        <xs:attribute name="action" type="FilterResult">
-          <xs:annotation>
-            <xs:documentation>Action to be taken when filter matches.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="ignoreCase" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Indicates whether to ignore case when comparing strings.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="layout" type="SimpleLayoutAttribute">
-          <xs:annotation>
-            <xs:documentation>Layout to be used to filter log messages.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="substring" type="xs:string">
-          <xs:annotation>
-            <xs:documentation>Substring to be matched.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-      </xs:extension>
-    </xs:complexContent>
-  </xs:complexType>
-  <xs:complexType name="whenEqual">
-    <xs:complexContent>
-      <xs:extension base="Filter">
-        <xs:choice minOccurs="0" maxOccurs="unbounded">
-          <xs:element name="action" minOccurs="0" maxOccurs="1" type="FilterResult" />
-          <xs:element name="compareTo" minOccurs="0" maxOccurs="1" type="xs:string" />
-          <xs:element name="ignoreCase" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-          <xs:element name="layout" minOccurs="0" maxOccurs="1" type="Layout" />
-        </xs:choice>
-        <xs:attribute name="action" type="FilterResult">
-          <xs:annotation>
-            <xs:documentation>Action to be taken when filter matches.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="compareTo" type="xs:string">
-          <xs:annotation>
-            <xs:documentation>String to compare the layout to.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="ignoreCase" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Indicates whether to ignore case when comparing strings.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="layout" type="SimpleLayoutAttribute">
-          <xs:annotation>
-            <xs:documentation>Layout to be used to filter log messages.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-      </xs:extension>
-    </xs:complexContent>
-  </xs:complexType>
-  <xs:complexType name="whenNotContains">
-    <xs:complexContent>
-      <xs:extension base="Filter">
-        <xs:choice minOccurs="0" maxOccurs="unbounded">
-          <xs:element name="action" minOccurs="0" maxOccurs="1" type="FilterResult" />
-          <xs:element name="ignoreCase" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-          <xs:element name="layout" minOccurs="0" maxOccurs="1" type="Layout" />
-          <xs:element name="substring" minOccurs="0" maxOccurs="1" type="xs:string" />
-        </xs:choice>
-        <xs:attribute name="action" type="FilterResult">
-          <xs:annotation>
-            <xs:documentation>Action to be taken when filter matches.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="ignoreCase" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Indicates whether to ignore case when comparing strings.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="layout" type="SimpleLayoutAttribute">
-          <xs:annotation>
-            <xs:documentation>Layout to be used to filter log messages.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="substring" type="xs:string">
-          <xs:annotation>
-            <xs:documentation>Substring to be matched.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-      </xs:extension>
-    </xs:complexContent>
-  </xs:complexType>
-  <xs:complexType name="whenNotEqual">
-    <xs:complexContent>
-      <xs:extension base="Filter">
-        <xs:choice minOccurs="0" maxOccurs="unbounded">
-          <xs:element name="action" minOccurs="0" maxOccurs="1" type="FilterResult" />
-          <xs:element name="compareTo" minOccurs="0" maxOccurs="1" type="xs:string" />
-          <xs:element name="ignoreCase" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-          <xs:element name="layout" minOccurs="0" maxOccurs="1" type="Layout" />
-        </xs:choice>
-        <xs:attribute name="action" type="FilterResult">
-          <xs:annotation>
-            <xs:documentation>Action to be taken when filter matches.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="compareTo" type="xs:string">
-          <xs:annotation>
-            <xs:documentation>String to compare the layout to.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="ignoreCase" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Indicates whether to ignore case when comparing strings.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="layout" type="SimpleLayoutAttribute">
-          <xs:annotation>
-            <xs:documentation>Layout to be used to filter log messages.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-      </xs:extension>
-    </xs:complexContent>
-  </xs:complexType>
-  <xs:complexType name="whenRepeated">
-    <xs:complexContent>
-      <xs:extension base="Filter">
-        <xs:choice minOccurs="0" maxOccurs="unbounded">
-          <xs:element name="action" minOccurs="0" maxOccurs="1" type="FilterResult" />
-          <xs:element name="defaultFilterCacheSize" minOccurs="0" maxOccurs="1" type="xs:integer" />
-          <xs:element name="includeFirst" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-          <xs:element name="layout" minOccurs="0" maxOccurs="1" type="Layout" />
-          <xs:element name="maxFilterCacheSize" minOccurs="0" maxOccurs="1" type="xs:integer" />
-          <xs:element name="maxLength" minOccurs="0" maxOccurs="1" type="xs:integer" />
-          <xs:element name="timeoutSeconds" minOccurs="0" maxOccurs="1" type="xs:integer" />
-          <xs:element name="optimizeBufferDefaultLength" minOccurs="0" maxOccurs="1" type="xs:integer" />
-          <xs:element name="optimizeBufferReuse" minOccurs="0" maxOccurs="1" type="xs:boolean" />
-          <xs:element name="filterCountMessageAppendFormat" minOccurs="0" maxOccurs="1" type="xs:string" />
-          <xs:element name="filterCountPropertyName" minOccurs="0" maxOccurs="1" type="xs:string" />
-        </xs:choice>
-        <xs:attribute name="action" type="FilterResult">
-          <xs:annotation>
-            <xs:documentation>Action to be taken when filter matches.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="defaultFilterCacheSize" type="xs:integer">
-          <xs:annotation>
-            <xs:documentation>Default number of unique filter values to expect, will automatically increase if needed</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="includeFirst" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Applies the configured action to the initial logevent that starts the timeout period. Used to configure that it should ignore all events until timeout.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="layout" type="SimpleLayoutAttribute">
-          <xs:annotation>
-            <xs:documentation>Layout to be used to filter log messages.</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="maxFilterCacheSize" type="xs:integer">
-          <xs:annotation>
-            <xs:documentation>Max number of unique filter values to expect simultaneously</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="maxLength" type="xs:integer">
-          <xs:annotation>
-            <xs:documentation>Max length of filter values, will truncate if above limit</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="timeoutSeconds" type="xs:integer">
-          <xs:annotation>
-            <xs:documentation>How long before a filter expires, and logging is accepted again</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="optimizeBufferDefaultLength" type="xs:integer">
-          <xs:annotation>
-            <xs:documentation>Default buffer size for the internal buffers</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="optimizeBufferReuse" type="xs:boolean">
-          <xs:annotation>
-            <xs:documentation>Reuse internal buffers, and doesn't have to constantly allocate new buffers</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="filterCountMessageAppendFormat" type="xs:string">
-          <xs:annotation>
-            <xs:documentation>Append FilterCount to the  when an event is no longer filtered</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-        <xs:attribute name="filterCountPropertyName" type="xs:string">
-          <xs:annotation>
-            <xs:documentation>Insert FilterCount value into  when an event is no longer filtered</xs:documentation>
-          </xs:annotation>
-        </xs:attribute>
-      </xs:extension>
-    </xs:complexContent>
-  </xs:complexType>
-  <xs:complexType name="AccurateLocal">
-    <xs:complexContent>
-      <xs:extension base="TimeSource">
-        <xs:choice minOccurs="0" maxOccurs="unbounded" />
-      </xs:extension>
-    </xs:complexContent>
-  </xs:complexType>
-  <xs:complexType name="AccurateUTC">
-    <xs:complexContent>
-      <xs:extension base="TimeSource">
-        <xs:choice minOccurs="0" maxOccurs="unbounded" />
-      </xs:extension>
-    </xs:complexContent>
-  </xs:complexType>
-  <xs:complexType name="FastLocal">
-    <xs:complexContent>
-      <xs:extension base="TimeSource">
-        <xs:choice minOccurs="0" maxOccurs="unbounded" />
-      </xs:extension>
-    </xs:complexContent>
-  </xs:complexType>
-  <xs:complexType name="FastUTC">
-    <xs:complexContent>
-      <xs:extension base="TimeSource">
-        <xs:choice minOccurs="0" maxOccurs="unbounded" />
-      </xs:extension>
-    </xs:complexContent>
-  </xs:complexType>
-</xs:schema>
\ No newline at end of file
diff --git a/src/Version/Program.cs b/src/Version/Program.cs
index 73ec6d3c7318bec2aca4049cb74ab37904ef2bf5..6aeda5b9adfeae9a9c55d5fe6fb3df28b30011a2 100644
--- a/src/Version/Program.cs
+++ b/src/Version/Program.cs
@@ -12,7 +12,7 @@ namespace Coscine.Api.Version
         /// Standard Main method.
         /// </summary>
         /// <param name="args"></param>
-        static void Main(string[] args)
+        static void Main()
         {
             InitializeWebService<Startup>();
         }
diff --git a/src/Version/Version.csproj b/src/Version/Version.csproj
index 1a86d83d1b7de756a95f2234e743802a0a879b1f..372fca4f6ea21aae73e9bce897e4bee307d6a97d 100644
--- a/src/Version/Version.csproj
+++ b/src/Version/Version.csproj
@@ -7,8 +7,6 @@
   <Import Project="..\packages\Microsoft.DiaSymReader.Native.1.7.0\build\Microsoft.DiaSymReader.Native.props" Condition="Exists('..\packages\Microsoft.DiaSymReader.Native.1.7.0\build\Microsoft.DiaSymReader.Native.props')" />
   <Import Project="..\packages\Microsoft.CodeAnalysis.Analyzers.2.9.2\build\Microsoft.CodeAnalysis.Analyzers.props" Condition="Exists('..\packages\Microsoft.CodeAnalysis.Analyzers.2.9.2\build\Microsoft.CodeAnalysis.Analyzers.props')" />
   <Import Project="..\packages\Microsoft.AspNetCore.Razor.Design.2.2.0\build\netstandard2.0\Microsoft.AspNetCore.Razor.Design.props" Condition="Exists('..\packages\Microsoft.AspNetCore.Razor.Design.2.2.0\build\netstandard2.0\Microsoft.AspNetCore.Razor.Design.props')" />
-  <Import Project="..\packages\linq2db.t4models.2.6.4\build\linq2db.t4models.props" Condition="Exists('..\packages\linq2db.t4models.2.6.4\build\linq2db.t4models.props')" />
-  <Import Project="..\packages\linq2db.SqlServer.2.6.4\build\linq2db.SqlServer.props" Condition="Exists('..\packages\linq2db.SqlServer.2.6.4\build\linq2db.SqlServer.props')" />
   <Import Project="..\packages\EntityFramework.6.4.4\build\EntityFramework.props" Condition="Exists('..\packages\EntityFramework.6.4.4\build\EntityFramework.props')" />
   <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
   <PropertyGroup>
@@ -45,23 +43,23 @@
     <WarningLevel>4</WarningLevel>
   </PropertyGroup>
   <ItemGroup>
-    <Reference Include="Aspose.Email, Version=20.10.0.0, Culture=neutral, PublicKeyToken=716fcc553a201e56, processorArchitecture=MSIL">
-      <HintPath>..\packages\Aspose.Email.20.10.0\lib\net40\Aspose.Email.dll</HintPath>
-    </Reference>
     <Reference Include="Consul, Version=0.7.2.6, Culture=neutral, PublicKeyToken=20a6ad9a81df1d95, processorArchitecture=MSIL">
       <HintPath>..\packages\Consul.0.7.2.6\lib\net45\Consul.dll</HintPath>
     </Reference>
-    <Reference Include="Coscine.ApiCommons, Version=1.10.0.0, Culture=neutral, PublicKeyToken=af4c1345df96546b, processorArchitecture=MSIL">
-      <HintPath>..\packages\Coscine.ApiCommons.1.10.0\lib\net461\Coscine.ApiCommons.dll</HintPath>
+    <Reference Include="Coscine.ApiCommons, Version=1.11.0.0, Culture=neutral, PublicKeyToken=af4c1345df96546b, processorArchitecture=MSIL">
+      <HintPath>..\packages\Coscine.ApiCommons.1.11.0\lib\net461\Coscine.ApiCommons.dll</HintPath>
     </Reference>
     <Reference Include="Coscine.Configuration, Version=1.5.0.0, Culture=neutral, PublicKeyToken=ce3d7a32d7dc1e5a, processorArchitecture=MSIL">
       <HintPath>..\packages\Coscine.Configuration.1.5.0\lib\net461\Coscine.Configuration.dll</HintPath>
     </Reference>
-    <Reference Include="Coscine.Database, Version=1.24.0.0, Culture=neutral, PublicKeyToken=767d77427707b70a, processorArchitecture=MSIL">
-      <HintPath>..\packages\Coscine.Database.1.24.0\lib\net461\Coscine.Database.dll</HintPath>
+    <Reference Include="Coscine.Database, Version=1.27.0.0, Culture=neutral, PublicKeyToken=767d77427707b70a, processorArchitecture=MSIL">
+      <HintPath>..\packages\Coscine.Database.1.27.0\lib\net461\Coscine.Database.dll</HintPath>
+    </Reference>
+    <Reference Include="Coscine.Database.T4, Version=1.27.0.0, Culture=neutral, PublicKeyToken=84b4c404a0696261, processorArchitecture=MSIL">
+      <HintPath>..\packages\Coscine.Database.1.27.0\lib\net461\Coscine.Database.T4.dll</HintPath>
     </Reference>
-    <Reference Include="Coscine.Database.T4, Version=1.24.0.0, Culture=neutral, PublicKeyToken=84b4c404a0696261, processorArchitecture=MSIL">
-      <HintPath>..\packages\Coscine.Database.1.24.0\lib\net461\Coscine.Database.T4.dll</HintPath>
+    <Reference Include="Coscine.JwtHandler, Version=1.2.0.0, Culture=neutral, PublicKeyToken=aaacf41df3a6253c, processorArchitecture=MSIL">
+      <HintPath>..\packages\Coscine.JwtHandler.1.2.0\lib\net461\Coscine.JwtHandler.dll</HintPath>
     </Reference>
     <Reference Include="Coscine.Logging, Version=1.2.0.0, Culture=neutral, PublicKeyToken=e1ed402bc3f6525e, processorArchitecture=MSIL">
       <HintPath>..\packages\Coscine.Logging.1.2.0\lib\net461\Coscine.Logging.dll</HintPath>
@@ -315,11 +313,11 @@
     <Reference Include="Microsoft.Extensions.WebEncoders, Version=2.2.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
       <HintPath>..\packages\Microsoft.Extensions.WebEncoders.2.2.0\lib\netstandard2.0\Microsoft.Extensions.WebEncoders.dll</HintPath>
     </Reference>
-    <Reference Include="Microsoft.IdentityModel.JsonWebTokens, Version=5.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
-      <HintPath>..\packages\Microsoft.IdentityModel.JsonWebTokens.5.5.0\lib\net461\Microsoft.IdentityModel.JsonWebTokens.dll</HintPath>
+    <Reference Include="Microsoft.IdentityModel.JsonWebTokens, Version=6.7.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
+      <HintPath>..\packages\Microsoft.IdentityModel.JsonWebTokens.6.7.1\lib\net461\Microsoft.IdentityModel.JsonWebTokens.dll</HintPath>
     </Reference>
-    <Reference Include="Microsoft.IdentityModel.Logging, Version=5.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
-      <HintPath>..\packages\Microsoft.IdentityModel.Logging.5.5.0\lib\net461\Microsoft.IdentityModel.Logging.dll</HintPath>
+    <Reference Include="Microsoft.IdentityModel.Logging, Version=6.7.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
+      <HintPath>..\packages\Microsoft.IdentityModel.Logging.6.7.1\lib\net461\Microsoft.IdentityModel.Logging.dll</HintPath>
     </Reference>
     <Reference Include="Microsoft.IdentityModel.Protocols, Version=5.3.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
       <HintPath>..\packages\Microsoft.IdentityModel.Protocols.5.3.0\lib\net461\Microsoft.IdentityModel.Protocols.dll</HintPath>
@@ -327,8 +325,8 @@
     <Reference Include="Microsoft.IdentityModel.Protocols.OpenIdConnect, Version=5.3.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
       <HintPath>..\packages\Microsoft.IdentityModel.Protocols.OpenIdConnect.5.3.0\lib\net461\Microsoft.IdentityModel.Protocols.OpenIdConnect.dll</HintPath>
     </Reference>
-    <Reference Include="Microsoft.IdentityModel.Tokens, Version=5.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
-      <HintPath>..\packages\Microsoft.IdentityModel.Tokens.5.5.0\lib\net461\Microsoft.IdentityModel.Tokens.dll</HintPath>
+    <Reference Include="Microsoft.IdentityModel.Tokens, Version=6.7.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
+      <HintPath>..\packages\Microsoft.IdentityModel.Tokens.6.7.1\lib\net461\Microsoft.IdentityModel.Tokens.dll</HintPath>
     </Reference>
     <Reference Include="Microsoft.Net.Http.Headers, Version=2.2.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60, processorArchitecture=MSIL">
       <HintPath>..\packages\Microsoft.Net.Http.Headers.2.2.0\lib\netstandard2.0\Microsoft.Net.Http.Headers.dll</HintPath>
@@ -404,8 +402,8 @@
       <Private>True</Private>
     </Reference>
     <Reference Include="System.Drawing" />
-    <Reference Include="System.IdentityModel.Tokens.Jwt, Version=5.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
-      <HintPath>..\packages\System.IdentityModel.Tokens.Jwt.5.5.0\lib\net461\System.IdentityModel.Tokens.Jwt.dll</HintPath>
+    <Reference Include="System.IdentityModel.Tokens.Jwt, Version=6.7.1.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL">
+      <HintPath>..\packages\System.IdentityModel.Tokens.Jwt.6.7.1\lib\net461\System.IdentityModel.Tokens.Jwt.dll</HintPath>
     </Reference>
     <Reference Include="System.IO.Compression, Version=4.2.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089, processorArchitecture=MSIL" />
     <Reference Include="System.IO.FileSystem, Version=4.0.2.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL">
@@ -519,72 +517,8 @@
     <Compile Include="Startup.cs" />
   </ItemGroup>
   <ItemGroup>
-    <None Include="App.config" />
-    <None Include="LinqToDB.Templates\DataAnnotations.ttinclude" />
-    <None Include="LinqToDB.Templates\DataModel.ttinclude" />
-    <None Include="LinqToDB.Templates\EditableObject.ttinclude" />
-    <None Include="LinqToDB.Templates\Humanizer.ttinclude" />
-    <None Include="LinqToDB.Templates\LinqToDB.Access.Tools.ttinclude" />
-    <None Include="LinqToDB.Templates\LinqToDB.Access.ttinclude" />
-    <None Include="LinqToDB.Templates\LinqToDB.DB2.Tools.ttinclude" />
-    <None Include="LinqToDB.Templates\LinqToDB.DB2.ttinclude" />
-    <None Include="LinqToDB.Templates\LinqToDB.Firebird.Tools.ttinclude" />
-    <None Include="LinqToDB.Templates\LinqToDB.Firebird.ttinclude" />
-    <None Include="LinqToDB.Templates\LinqToDB.Informix.Tools.ttinclude" />
-    <None Include="LinqToDB.Templates\LinqToDB.Informix.ttinclude" />
-    <None Include="LinqToDB.Templates\LinqToDB.MySql.Tools.ttinclude" />
-    <None Include="LinqToDB.Templates\LinqToDB.MySql.ttinclude" />
-    <None Include="LinqToDB.Templates\LinqToDB.Oracle.Managed.Tools.ttinclude" />
-    <None Include="LinqToDB.Templates\LinqToDB.Oracle.Tools.ttinclude" />
-    <None Include="LinqToDB.Templates\LinqToDB.Oracle.ttinclude" />
-    <None Include="LinqToDB.Templates\LinqToDB.Oracle.x64.Tools.ttinclude" />
-    <None Include="LinqToDB.Templates\LinqToDB.Oracle.x86.Tools.ttinclude" />
-    <None Include="LinqToDB.Templates\LinqToDB.PostgreSQL.Tools.ttinclude" />
-    <None Include="LinqToDB.Templates\LinqToDB.PostgreSQL.ttinclude" />
-    <None Include="LinqToDB.Templates\LinqToDB.SapHana.Tools.ttinclude" />
-    <None Include="LinqToDB.Templates\LinqToDB.SapHana.ttinclude" />
-    <None Include="LinqToDB.Templates\LinqToDB.SqlCe.Tools.ttinclude" />
-    <None Include="LinqToDB.Templates\LinqToDB.SqlCe.ttinclude" />
-    <None Include="LinqToDB.Templates\LinqToDB.SQLite.Tools.ttinclude" />
-    <None Include="LinqToDB.Templates\LinqToDB.SQLite.ttinclude" />
-    <None Include="LinqToDB.Templates\LinqToDB.SqlServer.SqlTypes.Tools.ttinclude" />
-    <None Include="LinqToDB.Templates\LinqToDB.SqlServer.SqlTypes.ttinclude" />
-    <None Include="LinqToDB.Templates\LinqToDB.SqlServer.Tools.ttinclude" />
-    <None Include="LinqToDB.Templates\LinqToDB.SqlServer.ttinclude" />
-    <None Include="LinqToDB.Templates\LinqToDB.Sybase.Tools.ttinclude" />
-    <None Include="LinqToDB.Templates\LinqToDB.Sybase.ttinclude" />
-    <None Include="LinqToDB.Templates\LinqToDB.Tools.ttinclude" />
-    <None Include="LinqToDB.Templates\LinqToDB.ttinclude" />
-    <None Include="LinqToDB.Templates\MultipleFiles.ttinclude" />
-    <None Include="LinqToDB.Templates\NotifyDataErrorInfo.ttinclude" />
-    <None Include="LinqToDB.Templates\NotifyPropertyChanged.ttinclude" />
-    <None Include="LinqToDB.Templates\ObsoleteAttributes.ttinclude" />
-    <None Include="LinqToDB.Templates\PluralizationService.ttinclude" />
-    <None Include="LinqToDB.Templates\README.md" />
-    <None Include="LinqToDB.Templates\T4Model.ttinclude" />
-    <None Include="LinqToDB.Templates\Validation.ttinclude" />
-    <Content Include="NLog.config">
-      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
-    </Content>
-    <None Include="NLog.xsd">
-      <SubType>Designer</SubType>
-    </None>
     <None Include="packages.config" />
   </ItemGroup>
-  <ItemGroup>
-    <Content Include="LinqToDB.Templates\CopyMe.Access.tt.txt" />
-    <Content Include="LinqToDB.Templates\CopyMe.DB2.tt.txt" />
-    <Content Include="LinqToDB.Templates\CopyMe.Firebird.tt.txt" />
-    <Content Include="LinqToDB.Templates\CopyMe.Informix.tt.txt" />
-    <Content Include="LinqToDB.Templates\CopyMe.MySql.tt.txt" />
-    <Content Include="LinqToDB.Templates\CopyMe.Oracle.tt.txt" />
-    <Content Include="LinqToDB.Templates\CopyMe.PostgreSQL.tt.txt" />
-    <Content Include="LinqToDB.Templates\CopyMe.SapHana.tt.txt" />
-    <Content Include="LinqToDB.Templates\CopyMe.SqlCe.tt.txt" />
-    <Content Include="LinqToDB.Templates\CopyMe.SQLite.tt.txt" />
-    <Content Include="LinqToDB.Templates\CopyMe.SqlServer.tt.txt" />
-    <Content Include="LinqToDB.Templates\CopyMe.Sybase.tt.txt" />
-  </ItemGroup>
   <ItemGroup>
     <Analyzer Include="..\packages\Microsoft.CodeAnalysis.Analyzers.2.9.2\analyzers\dotnet\cs\Microsoft.CodeAnalysis.Analyzers.dll" />
     <Analyzer Include="..\packages\Microsoft.CodeAnalysis.Analyzers.2.9.2\analyzers\dotnet\cs\Microsoft.CodeAnalysis.CSharp.Analyzers.dll" />
@@ -596,8 +530,6 @@
     </PropertyGroup>
     <Error Condition="!Exists('..\packages\EntityFramework.6.4.4\build\EntityFramework.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\EntityFramework.6.4.4\build\EntityFramework.props'))" />
     <Error Condition="!Exists('..\packages\EntityFramework.6.4.4\build\EntityFramework.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\EntityFramework.6.4.4\build\EntityFramework.targets'))" />
-    <Error Condition="!Exists('..\packages\linq2db.SqlServer.2.6.4\build\linq2db.SqlServer.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\linq2db.SqlServer.2.6.4\build\linq2db.SqlServer.props'))" />
-    <Error Condition="!Exists('..\packages\linq2db.t4models.2.6.4\build\linq2db.t4models.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\linq2db.t4models.2.6.4\build\linq2db.t4models.props'))" />
     <Error Condition="!Exists('..\packages\Microsoft.AspNetCore.Razor.Design.2.2.0\build\netstandard2.0\Microsoft.AspNetCore.Razor.Design.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Microsoft.AspNetCore.Razor.Design.2.2.0\build\netstandard2.0\Microsoft.AspNetCore.Razor.Design.props'))" />
     <Error Condition="!Exists('..\packages\Microsoft.CodeAnalysis.Analyzers.2.9.2\build\Microsoft.CodeAnalysis.Analyzers.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Microsoft.CodeAnalysis.Analyzers.2.9.2\build\Microsoft.CodeAnalysis.Analyzers.props'))" />
     <Error Condition="!Exists('..\packages\Microsoft.DiaSymReader.Native.1.7.0\build\Microsoft.DiaSymReader.Native.props')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\Microsoft.DiaSymReader.Native.1.7.0\build\Microsoft.DiaSymReader.Native.props'))" />
diff --git a/src/Version/packages.config b/src/Version/packages.config
index 98e4db61cda19292530a244b9b3a4e032edda6c3..da365a738a51f53cf363180dd8ce95f54971b0be 100644
--- a/src/Version/packages.config
+++ b/src/Version/packages.config
@@ -1,15 +1,13 @@
 <?xml version="1.0" encoding="utf-8"?>
 <packages>
-  <package id="Aspose.Email" version="20.10.0" targetFramework="net461" />
   <package id="Consul" version="0.7.2.6" targetFramework="net461" />
-  <package id="Coscine.ApiCommons" version="1.10.0" targetFramework="net461" />
+  <package id="Coscine.ApiCommons" version="1.11.0" targetFramework="net461" />
   <package id="Coscine.Configuration" version="1.5.0" targetFramework="net461" />
-  <package id="Coscine.Database" version="1.24.0" targetFramework="net461" />
+  <package id="Coscine.Database" version="1.27.0" targetFramework="net461" />
+  <package id="Coscine.JwtHandler" version="1.2.0" targetFramework="net461" />
   <package id="Coscine.Logging" version="1.2.0" targetFramework="net461" />
   <package id="EntityFramework" version="6.4.4" targetFramework="net461" />
   <package id="linq2db" version="3.1.1" targetFramework="net461" />
-  <package id="linq2db.SqlServer" version="2.6.4" targetFramework="net461" />
-  <package id="linq2db.t4models" version="2.6.4" targetFramework="net461" />
   <package id="LinqKit" version="1.1.17" targetFramework="net461" />
   <package id="Microsoft.AspNetCore.Antiforgery" version="2.2.0" targetFramework="net461" />
   <package id="Microsoft.AspNetCore.Authentication" version="2.2.0" targetFramework="net461" />
@@ -96,11 +94,11 @@
   <package id="Microsoft.Extensions.Options" version="2.2.0" targetFramework="net461" />
   <package id="Microsoft.Extensions.Primitives" version="2.2.0" targetFramework="net461" />
   <package id="Microsoft.Extensions.WebEncoders" version="2.2.0" targetFramework="net461" />
-  <package id="Microsoft.IdentityModel.JsonWebTokens" version="5.5.0" targetFramework="net461" />
-  <package id="Microsoft.IdentityModel.Logging" version="5.5.0" targetFramework="net461" />
+  <package id="Microsoft.IdentityModel.JsonWebTokens" version="6.7.1" targetFramework="net461" />
+  <package id="Microsoft.IdentityModel.Logging" version="6.7.1" targetFramework="net461" />
   <package id="Microsoft.IdentityModel.Protocols" version="5.3.0" targetFramework="net461" />
   <package id="Microsoft.IdentityModel.Protocols.OpenIdConnect" version="5.3.0" targetFramework="net461" />
-  <package id="Microsoft.IdentityModel.Tokens" version="5.5.0" targetFramework="net461" />
+  <package id="Microsoft.IdentityModel.Tokens" version="6.7.1" targetFramework="net461" />
   <package id="Microsoft.Net.Http.Headers" version="2.2.0" targetFramework="net461" />
   <package id="Microsoft.Win32.Registry" version="4.5.0" targetFramework="net461" />
   <package id="Namotion.Reflection" version="1.0.11" targetFramework="net461" />
@@ -127,7 +125,7 @@
   <package id="System.Diagnostics.DiagnosticSource" version="4.5.1" targetFramework="net461" />
   <package id="System.Diagnostics.StackTrace" version="4.3.0" targetFramework="net461" />
   <package id="System.Dynamic.Runtime" version="4.3.0" targetFramework="net461" />
-  <package id="System.IdentityModel.Tokens.Jwt" version="5.5.0" targetFramework="net461" />
+  <package id="System.IdentityModel.Tokens.Jwt" version="6.7.1" targetFramework="net461" />
   <package id="System.IO" version="4.3.0" targetFramework="net461" />
   <package id="System.IO.FileSystem" version="4.3.0" targetFramework="net461" />
   <package id="System.IO.FileSystem.Primitives" version="4.3.0" targetFramework="net461" />